您的位置:首页 > 其它

BZOJ2705 [SDOI2012]Longge的问题

2015-10-15 21:11 405 查看

2705: [SDOI2012]Longge的问题

Time Limit: 3 Sec Memory Limit: 128 MB
Submit: 1654 Solved: 1042
[Submit][Status][Discuss]

Description

[align=left]Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。[/align]

Input

[align=left]一个整数,为N。[/align]

Output

[align=left]一个整数,为所求的答案。[/align]

Sample Input

6

Sample Output

15

HINT

【数据范围】

对于60%的数据,0<N<=2^16。

对于100%的数据,0<N<=2^32。

Source

round1 day1

【思路】源于网上



白书不愧是神书,与UVa11426同

【代码】

#include<iostream>
#include<cmath>
using namespace std;

typedef long long LL;
int n;

inline LL euler_phi(int p) {
int m=sqrt(p);
LL ans=p;
for(int i=2;i<=m;i++) if(p%i==0)
{
ans=ans/i*(i-1);
while(p%i==0) p/=i;
}
if(p>1) ans=ans/p*(p-1);
return ans;
}

int main() {
cin>>n;
LL ans=0;
for(int i=1;i*i<=n;i++)
if(n%i==0) {
ans += i*euler_phi(n/i);
if(i*i<n) ans += n/i*euler_phi(i);
}
cout<<ans;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: