HDU 5317(数论,素数筛法)
2017-03-15 21:14
337 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5317
题解:题目大意:自己去读读,学算法的人,总不会都英语都学不好吧。
我的思路:因为2*3*5*7*11*13*17 = 510510, 所以f只有7个值
先用筛法查出没每个数的f函数值,然后在sum[i][j]求出从1到if函数值为j的数的总个数,然后求出区间【L, R】中每个函数值的数的个数,然后再求最大gcd;
下面附上代码:
题解:题目大意:自己去读读,学算法的人,总不会都英语都学不好吧。
我的思路:因为2*3*5*7*11*13*17 = 510510, 所以f只有7个值
先用筛法查出没每个数的f函数值,然后在sum[i][j]求出从1到if函数值为j的数的总个数,然后求出区间【L, R】中每个函数值的数的个数,然后再求最大gcd;
下面附上代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; int a[1000005], sum[1000005][8]; //a用来存每个数的f函数值, sum[i][j]用来存到从1到i位f函数值位j的数的总个数 int main() { a[1] = 0; for(int i = 2; i <= 1000000; i++) { if(!a[i]) { a[i]++; for(int j = 2*i; j <= 1000000; j+=i) a[j]++; } } for(int i = 2; i <= 1000000; i++) { for(int j = 1; j <= 7; j++) { sum[i][j] = sum[i-1][j] + (a[i] == j); } } int N; scanf("%d", &N); while(N--) { int x, y; scanf("%d%d", &x, &y); int c[8]; for(int i = 1; i <= 7; i++) // 求区间内f值为i的数有多少个。 { c[i] = sum[y][i]- sum[x-1][i]; } int ans = 1; for(int i = 7; i >=1; i--)// 从高往低 { if(c[i] >= 2) // 如果有两个数的f函数都等于i,那么这两个数的gcd肯定等于i { ans = i; break; } } if(c[2]>0 && (c[4]>0 || c[6]>0)) ans = max(ans, 2); // 2和4或6的gcd为2 if(c[3]>0 && c[6]>0) ans = max(ans, 3);//3和6的gcd为3 if(c[4]>0 && c[6]>0) ans = max(ans, 2);// 4和6的gcd为2 printf("%d\n", ans); } }
相关文章推荐
- hdu 5317 RGCDQ(数论素筛)
- hdu 5317 RGCDQ(数论素筛)
- B - RGCDQ-HDU 5317-素数筛法
- hdu 5317 RGCDQ(数论素筛)
- ACM学习历程—HDU 5317 RGCDQ (数论)
- hdu 5317 RGCDQ(数论素筛)
- hdu 5317 RGCDQ(数论素筛)
- hdu 5317 RGCDQ(数论素筛)
- hdu 5317 RGCDQ(数论素筛)
- hdu 5317 RGCDQ(数论素筛)
- hdu 5317 RGCDQ(数论素筛)
- HDU 5317(2015多校3)-RGCDQ(数论)
- hdu 5317 RGCDQ(数论素筛)
- hdu 5317 RGCDQ(数论素筛)
- HDU 3988 Harry Potter and the Hide Story(数论)(素数筛法)
- hdu 5317 RGCDQ(数论素筛)
- hdu 5317 RGCDQ(数论素筛)
- hdu 5317 RGCDQ(数论素筛)
- hdu 2098 分拆素数和(素数筛法)
- hdu 4345 Permutation 【数论+dp】