最大公约数之和
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
题目很简单,求出:
-
输入
- 每行一个数n(n<2^31),以文件结束。 输出
- 每个结果占一行。 样例输入
-
12
样例输出
-
40
-
/* 数据较大 需要用long long 型 Time:2014-10-12 21:37 */ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int Eular(int n){ int ans=n; for(int i=2;i*i<=n;i++){ if(n%i==0){ ans-=ans/i; while(n%i==0) n/=i; } } if(n!=1)//n为素数 ans-=ans/n; return ans; } int main(){ int n; while(scanf("%d",&n)!=EOF){ long long sum=0; for(int i=1;i*i<=n;i++){ if(i*i==n){ sum+=i*Eular(i); break; } if(n%i==0){ sum+=(long long)i*Eular(n/i); sum+=(long long)(n/i)*Eular(i); } } printf("%lld\n",sum); } return 0; }