【HDU2582 關於 gcd( C[n][1],C[n][2],C[n][3],........C[n][n-1) 】
阿新 • • 發佈:2018-12-02
給出公式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; }