标签:acm
点击打开链接题目链接
2 2 3 3 5
1 1
给出l,r求在l,r中任意f(i)和f(j)的gcd的最大值
预处理出所有素数 和所有数的f
用s[i][j]代表j数之前f值为i的个数
代码:
#include<cstdio> #include<cstring> #include<algorithm> #define MAXN 1111111 using namespace std; bool is_prime[MAXN]; int prime[MAXN]; int f[MAXN]; int s[10][MAXN]; void init1(){ int p=1; for(int i=0;i<=MAXN;i++) is_prime[i]=1; is_prime[0]=is_prime[1]=0; for(int i=2;i<=MAXN;i++){ if(is_prime[i]){ prime[p++]=i; for(int j=2*i;j<=MAXN;j+=i) is_prime[j]=0; } } } int getfact(int x){ int ans=0; for(int i=1;prime[i]*prime[i]<=x;i++){ if(x%prime[i]==0){ ans++; while(x%prime[i]==0) x/=prime[i]; if(is_prime[x]){ ans++; break; } } } return ans; } void init2(){ memset(s,0,sizeof(s)); s[1][2]=1; for(int i=1;i<=MAXN;i++){ for(int j=1;j<=7;j++){ if(j!=f[i]) s[j][i]=s[j][i-1]; else s[j][i]=s[j][i-1]+1; } } } int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b); } int main(){ init1(); for(int i=2;i<=MAXN;i++){ if(is_prime[i]) f[i]=1; else f[i]=getfact(i); } init2(); int l,r; int t; scanf("%d",&t); int cnt[10]; while(t--){ scanf("%d %d",&l,&r); l--; for(int i=1;i<=7;i++){ cnt[i]=s[i][r]-s[i][l]; } int ans=0; for(int i=7;i>=1;i--){ if(cnt[i]>=2){ ans=i; break; } } for(int i=1;i<=7;i++){ if(cnt[i]){ for(int j=i+1;j<=7;j++){ if(cnt[j]){ ans=max(ans,gcd(i,j)); } } } } printf("%d\n",ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:acm
原文地址:http://blog.csdn.net/qq_16843991/article/details/47110333