BZOJ2705 [SDOI2012]Longge的问题
2705: [SDOI2012]Longge的问题
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1654 Solved: 1042
[Submit][Status][Discuss]
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。
Source
【思路】源于网上
白书不愧是神书,与UVa11426同
【代码】
1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 5 typedef long long LL; 6 int n; 7 8 inline LL euler_phi(int p) { 9 int m=sqrt(p); 10 LL ans=p; 11 for(int i=2;i<=m;i++) if(p%i==0) 12 { 13 ans=ans/i*(i-1); 14 while(p%i==0) p/=i; 15 } 16 if(p>1) ans=ans/p*(p-1); 17 return ans; 18 } 19 20 int main() { 21 cin>>n; 22 LL ans=0; 23 for(int i=1;i*i<=n;i++) 24 if(n%i==0) { 25 ans += i*euler_phi(n/i); 26 if(i*i<n) ans += n/i*euler_phi(i); 27 } 28 cout<<ans; 29 return 0; 30 }
posted on 2015-10-15 21:11 hahalidaxin 阅读(191) 评论(0) 编辑 收藏 举报