1. 程式人生 > >【HDU2582 關於 gcd( C[n][1],C[n][2],C[n][3],........C[n][n-1) 】

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

給出公式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;
}