BZOJ2705: [SDOI2012]Longge的问题
Description
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
Input
一个整数,为N。
Output
一个整数,为所求的答案。
Sample Input
6
Sample Output
15
HINT
【数据范围】
对于60%的数据,0<N<=2^16。
对于100%的数据,0<N<=2^32。
丝帛题,枚举gcd(n,i),将N的所有约数求出来,然后容斥一下就能对于每个gcd(n,i)计算满足条件的i的个数了。
时间复杂度O(sqrt(N))。
#include<cstdio> #include<cctype> #include<queue> #include<cstring> #include<algorithm> #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define ren for(int i=first[x];i;i=next[i]) using namespace std; typedef long long ll; const int maxn=1010; ll pri[maxn],ans[maxn],res,n; int cnt; int main() { scanf("%lld",&n); for(ll i=1;i*i<=n;i++) if(n%i==0) { pri[++cnt]=i; if(i*i!=n) pri[++cnt]=n/i; } sort(pri+1,pri+cnt+1); dwn(i,cnt,1) { ans[i]=n/pri[i]; rep(j,i+1,cnt) if(pri[j]%pri[i]==0) ans[i]-=ans[j]; } rep(i,1,cnt) res+=ans[i]*pri[i]; printf("%lld\n",res); return 0; }