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> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int X=1000010; 8 bool isPrime[X+1]; 9 int total;//计数 10 int prime[79000]; 11 void getPrime() 12 { 13 total=0; 14 memset(isPrime,true,sizeof(isPrime)); 15 memset(prime,0,sizeof(prime)); 16 for(int i=2;i<=X;i++) 17 { 18 if(isPrime[i]) prime[total++]=i; 19 for(int j=0; j<total && i*prime[j]<=X; j++) 20 { 21 isPrime[i*prime[j]]=false; 22 if(i%prime[j]==0) 23 break; 24 } 25 } 26 } 27 28 int dp[X][9]; 29 int num[X]; 30 void getCot() 31 { 32 memset(num,0,sizeof(num)); 33 for(int i=0;prime[i]<=1000000;i++) 34 for(int j=prime[i];j<=1000000;j+=prime[i]) 35 num[j]++; 36 } 37 38 void gao() 39 { 40 memset(dp,0,sizeof(dp)); 41 dp[2][1]=1; 42 for(int i=3;i<=1000000;i++) 43 { 44 int ans=num[i]; 45 for(int j=1;j<=7;j++) 46 dp[i][j]=dp[i-1][j]; 47 dp[i][ans]++; 48 } 49 } 50 int main() 51 { 52 int T,l,r,aa[10],ma; 53 getPrime(); 54 getCot(); 55 gao(); 56 scanf("%d",&T); 57 while(T--) 58 { 59 ma=1; 60 scanf("%d%d",&l,&r); 61 for(int i=1;i<=7;i++) 62 { 63 aa[i]=dp[r][i]-dp[l-1][i]; 64 if(aa[i]>=2&&i>ma) 65 ma=i; 66 } 67 if(aa[6]>0&&aa[3]>0) 68 ma=max(ma,3); 69 else if(aa[6]>0&&aa[2]>0||aa[4]>0&&aa[2]>0) 70 ma=max(ma,2); 71 printf("%d\n",ma); 72 } 73 return 0; 74 }