题意:
求一个数 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;
} 
京公网安备 11010502036488号