【HDU2582 关于 gcd( C[n][1],C[n][2],C[n][3],........C[n][n-1) 】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sxy201658506207/article/details/84676627

给出公式Gcd(n)=gcd(C[n][1],C[n][2],……,C[n][n-1]),
求f(n)= Gcd(3)+Gcd(4)+…+Gcd(i)+…+Gcd(n)。

关于组合数的最大公约数:
gcd(C[n][1],C[n][2],C[n][3],........C[n][n-1)
当n 只有一个素数因子的时候,gcd=素数因子
当n 有多个素数因子的时候,gcd=1

 

#include <bits/stdc++.h>
#define X 10005
#define inf 0x3f3f3f3f
#define PI 3.141592653589793238462643383
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long ll;
const int N = 1e6 + 5;
ll primer[N],a[N],f[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int n,cnt=0;
    for(int i=2; i<sqrt(N); ++i) //sqrt(N)之后的在j层被晒完了
    {
        if(!a[i])
        {
            primer[cnt++]=i;
            for(int j=i*i; j<N; j+=i)
                a[j]=1;
        }
    }
    for(int i=3; i<N; ++i)
    {
        if(!a[i])   f[i]=f[i-1]+i;
        else
        {
            int I=i,t;
            int p;
            for(p=0; primer[p]*primer[p]<=I&&p<cnt; ++p)
            {
                if(I%primer[p]==0)
                {
                    while(I%primer[p]==0) I/=primer[p];
                    break;
                }
            }
            if(I==1)
                f[i]=f[i-1]+primer[p];//只有一个质因子
            else
                f[i]=f[i-1]+1; //多个
        }
    }
    while(cin>>n)
    {
        cout<<f[n]<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sxy201658506207/article/details/84676627