题意:
求一个数 x 除 1 外所有因子的 gcd。
分析:
此题我们可以对数进行分类讨论:
一:如果一个数是质数,那么它除1以外的因数就只有他本身,此时因子的gcd也就等于他本身。
二:如果一个数是合数,那么他又可以分成两种情况:1.如果他是一个质数的次方数,那么他的除1之外的因子就只有那个质数和他本身,又因为他本身是那个质数的次方数,则gcd就等于那个质数;2:如果他是一个普通的合数,即由两个或以上的质数相乘得到,那么它除1以外的因子就有两个以上的质数,所以他们的gcd只能是1。
至此我们就分析完成了,我们只需要使用线性筛筛出质数,并在这个过程中按照上方的分析处理一下每个数的所求gcd,最终输出两个输入a和b之间的gcd的和即可。
代码:
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; int x,y,a[10000010],v[10000010]; long long ans[10000010],sum,cnt; void Getv(int n) { memset(a,1,sizeof(a)); a[1]=0; for(int i=2;i<=n;i++) { if(!ans[i]) ans[i]=1; if(a[i]) { v[++cnt]=i; ans[i]=i; } for(int j=1;j<=cnt&&i*v[j]<=n;j++) { a[i*v[j]]=0; if(ans[i]==v[j]) ans[i*v[j]]=ans[i]; if(i%v[j]==0) break; } } } int main() { scanf("%d%d",&x,&y); if(x>y) swap(x,y); Getv(y); for(int i=x;i<=y;i++) { sum+=ans[i]; } printf("%lld",sum); return 0; }