题意:

求一个数 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;
}