数学+dp HDOJ 5317 RGCDQ

题目传送门

 1 /*
 2     题意:给一个区间,问任意两个数的素数因子的GCD最大
 3     数学+dp:预处理出f[i],发现f[i] <= 7,那么用dp[i][j] 记录前i个f[]个数为j的数有几个,
 4             dp[r][j] - dp[l-1][j]表示区间内j的个数,情况不多,分类讨论一下
 5 */
 6 #include <cstdio>
 7 #include <algorithm>
 8 #include <cstring>
 9 #include <vector>
10 #include <cmath>
11 using namespace std;
12
13 const int MAXN = 1e6 + 10;
14 const int INF = 0x3f3f3f3f;
15 bool is_prime[MAXN];
16 int f[MAXN];
17 int dp[MAXN][10];
18 int cnt[10];
19 int n;
20
21 int GCD(int a, int b)    {
22     return (b == 0) ? a : GCD (b, a % b);
23 }
24
25 void solve(void)    {
26     memset (is_prime, true, sizeof (is_prime));
27     for (int i=2; i<=n; ++i)    {
28         if (is_prime[i])    {
29             for (int j=i; j<=n; j+=i)    {
30                 f[j]++;    is_prime[j] = false;
31             }
32         }
33     }
34 }
35
36 void work(void)    {
37     memset (dp, 0, sizeof (dp));
38     for (int i=2; i<=n; ++i)    {
39         for (int j=1; j<=7; ++j)    {
40             dp[i][j] = dp[i-1][j];
41         }
42         dp[i][f[i]]++;
43     }
44 }
45
46 int main(void)    {       //HDOJ 5317 RGCDQ
47     //freopen ("B.in", "r", stdin);
48     n = 1000000;
49     solve ();    work();
50
51     int T;
52     scanf ("%d", &T);
53     while (T--)    {
54         int l, r;
55         scanf ("%d%d", &l, &r);
56         bool ok = false;
57         for (int i=7; i>=2; --i)    {
58             if (dp[r][i] - dp[l-1][i] >= 2)    {
59                 printf ("%d\n", i);    ok = true;    break;
60             }
61         }
62         if (!ok)    {
63             if(dp[r][6] - dp[l-1][6] == 1 && dp[r][4] - dp[l-1][4] == 1) {
64                 printf("2\n");
65             } else if(dp[r][6] - dp[l-1][6] == 1 && dp[r][2] - dp[l-1][2] == 1) {
66                 printf("2\n");
67             } else if(dp[r][4] - dp[l-1][4] == 1 && dp[r][2] - dp[l-1][2] == 1) {
68                 printf("2\n");
69             } else {
70                 printf("1\n");
71             }
72         }
73     }
74
75     return 0;
76 }
时间: 2024-10-27 03:18:53

数学+dp HDOJ 5317 RGCDQ的相关文章

HDOJ 5317 RGCDQ 水

预处理出每个数有多少个不同的因数,因数最多不超过7 RGCDQ Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 641    Accepted Submission(s): 304 Problem Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He

hdoj 5317 RGCDQ

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5317 1 #include<stdio.h> 2 3 const int MAXN = 1000010; 4 int F[MAXN]; 5 bool flag[MAXN]; 6 int S[8][MAXN]; 7 8 void init(){ 9 //对数据进行初始化 10 for(int i = 2; i <= MAXN ; ++i) 11 if(!flag[i]){ 12 F[i]++;

2015 HDU 多校联赛 5317 RGCDQ 筛法求解

2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目  http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据量大, 所以必须做预处理.也就是用筛法求出全部的F[x],将全部F[x] 打印出来发现.事实上结果不大,最大的数值是7.所以对于每一个区间询问, 直接暴力求取有多少个 1 2 3 4 5 6 7 就可以,从大到小查找.假设出现2个以上 3-7 的数值,那么最大公约数就是该数字. 假设没有出现两个反复

hdoj 4901 The Romantic Hero DP hdoj 4902 Nice boat 线段树

惨遭丽洁乱虐..这一场也是比得乱七八糟的,4902本是丽洁定义比较难的题,结果数据随机的,被许多暴力水过了..4905考察的是四边形不等式优化,但是这道题的dp方程实际上不满足该优化的条件..朴素的o(n^3)会超时,所以这题目前是没有正解了..我还写了个这题的贪心,强度挺高,可以对大概一半数据,错的误差也只有个位数,还揪出官方第五个数据..朴素dp和贪心跑这个数据都比官方数据多了1,也就证明这题不满足四边形不等式优化的条件.. http://acm.hdu.edu.cn/showproblem

HDU 5317 RGCDQ (合数分解+预处理)

题目链接:HDU 5317 RGCDQ 题意:定义函数F(x)为x的不同的素因子且小于等于x的个数,询问[l,r]区间中gcd(F(i),F(j))的最大值. 思路:暴力预处理出所有的合数分解结果,发现F(x)最大也只有7,之后就是暴力求出所有1到7出现次数的前缀和.询问的时候就打到O(1)了. AC代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #

数学+DP Codeforces Round #304 (Div. 2) D. Soldier and Number Game

题目传送门 1 /* 2 题意:这题就是求b+1到a的因子个数和. 3 数学+DP:a[i]保存i的最小因子,dp[i] = dp[i/a[i]] +1;再来一个前缀和 4 */ 5 /************************************************ 6 Author :Running_Time 7 Created Time :2015-8-1 14:08:34 8 File Name :B.cpp 9 ******************************

hdu 5317 RGCDQ (2015多校第三场第2题)素数打表+前缀和相减求后缀(DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5317 题意:F(x) 表示x的不同质因子的个数结果是求L,R区间中最大的gcd( F(i) , F(j) ),i.j在L,R区间内. 思路:因为2<=L < R<=1000000,所以他们的质因子最多的个数也就7个,也就是说1<=F(x)<=7,因为要求最大的GCD,所以只要知道在L,R区间内每个F(x)的情况就可以知道结果. 代码: 1 #include <stdio.h

背包DP HDOJ 5410 CRB and His Birthday

题目传送门 题意:有n个商店,有m金钱,一个商店买x件商品需要x*w[i]的金钱,得到a[i] * x + b[i]件商品(x > 0),问最多能买到多少件商品 01背包+完全背包:首先x == 1时,得到a[i] + b[i],若再买得到的是a[i],那么x == 1的情况用01背包思想,x > 1时就是在01的基础上的完全背包.背包dp没刷过专题,这么简单的题也做不出来:( /************************************************* Author

找规律/数位DP HDOJ 4722 Good Numbers

题目传送门 1 /* 2 找规律/数位DP:我做的时候差一点做出来了,只是不知道最后的 is_one () 3 http://www.cnblogs.com/crazyapple/p/3315436.html 4 数位DP:http://blog.csdn.net/cyendra/article/details/11606209 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <algorithm> 9