20160322 HDU5317 RGCDQ(筛数+树状数组)
来源:互联网 发布:linux ssh暴力破解 编辑:程序博客网 时间:2024/05/19 23:04
题意:
F(n)是n的不同素因子的个数,求在[ L,R ],区间内最大的gcd(F(i),F(j))。
思路:
看上去是数论的数据结构题......
可以注意得到数据范围小于1E6,意味着F(n)的取值范围很小(不会超过7)。
很容易想到记每个位置的F(n),在查询区间时返回区间内各个F(n)的个数,然后判断gcd值的方法。
用素数表将范围内所有的F(n)筛选出来,通过树状数组来求区间和。
#include <iostream>#include <stdio.h>#include <math.h>using namespace std;int pri[168]= {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};int a[1000000+5],k[1000000+5];int c[8][1000000+5];inline int lowbit(int x){ return (x&-x);}void add(int x,int d){ for(int i=x; i<=1000005; i+=lowbit(i)) c[d][i]+=1;}int get(int x,int d){ int sum=0; for(int i=x; i; i-=lowbit(i)) sum+=c[d][i]; return sum;}void solve(){ for(int i=0; i<1000005; i++) k[i]=i; for(int i=0; i<168; i++) { int c=pri[i]; while(c<1000005) { a[c]++; while(k[c]%pri[i]==0) { k[c]/=pri[i]; } c+=pri[i]; } } for(int i=2; i<1000005; i++) { if(k[i]!=1) a[i]++; add(i,a[i]); }}int main(){ solve(); //cout<<a[570570]<<endl; int T,l,r; scanf("%d",&T); while(T--) { scanf("%d%d",&l,&r); int d[17]; for(int i=1; i<=7; i++) d[i]=get(r,i)-get(l-1,i); /*int sum=0; for(int i=0;i<8;i++) { cout<<"test "<<i<<endl; cout<<get(r,i)<<" "<<get(l-1,i)<<endl; cout<<d[i]<<endl; sum+=d[i]; } cout<<sum<<endl;*/ if(d[7]>=2) { printf("7\n"); } else if(d[6]>=2) { printf("6\n"); } else if(d[5]>=2) { printf("5\n"); } else if(d[4]>=2) { printf("4\n"); } else if(d[3]>=2||(d[6]==1&&d[3]==1)) { printf("3\n"); } else if(d[2]>=2||(d[6]==1&&d[4]==1)||(d[6]==1&&d[2]==1)||(d[4]==1&&d[2]==1)) { printf("2\n"); } else { printf("1\n"); } } return 0;}
0 0
- 20160322 HDU5317 RGCDQ(筛数+树状数组)
- HDU5317 RGCDQ(数论素筛)
- HDU5317:RGCDQ (数学 & 二分)
- hdu5317(2015多校3)--RGCDQ(素数筛+枚举)
- hdu5317 RGCDQ (素数筛+递推方程)
- hdu5317 RGCDQ
- HDU5317.RGCDQ
- hdu5317 RGCDQ
- RGCDQ (HDU5317)
- hdu5317 RGCDQ
- Hdu5317 RGCDQ
- hdu5317 RGCDQ (质因子种数+预处理)
- hdu5317 RGCDQ 统计
- hdu5317 RGCDQ(dp)
- 2015 Multi-University Training Contest 3 1002RGCDQ(hdu5317)
- 2015年多校联合训练第三场RGCDQ(hdu5317)
- HDU5317 RGCDQ 质因子分解
- 解题报告 之 HDU5317 RGCDQ
- mysql设置远程IP地址访问数据库
- 自定义模板引擎_2
- RecyclerView使用详解(三)
- 互联网的安全
- Android 学习笔记(一)
- 20160322 HDU5317 RGCDQ(筛数+树状数组)
- HDU 2609 How many
- ThinkPHP 验证码类 Verify
- 数据结构顺序表
- UE4官方视频学习日志:3rd Person Game with Blueprints
- maven jetty 插件的使用
- git 常见问题解决命令
- C# 理解Thread.Sleep()
- tomcat组成及工作原理