您的位置:首页 > 其它

BZOj2705: [SDOI2012]Longge的问题

2016-03-16 11:16 441 查看

2705: [SDOI2012]Longge的问题

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 1941  Solved: 1219

[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。

设n的约数k则有求满足gcd(n,m)=k的m的个数转化gcd(n/k,m/k)=1的个数

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<list>
#include<vector>
using namespace std;
long long Euler(long long n){
long long ret=1,i;
for(i=2;i*i<=n;++i){
if(n%i==0){
n/=i;ret*=i-1;
while(n%i==0){
n/=i;ret*=i;
}
}
}
if(n>1)ret*=n-1;
return ret;
}
int main()
{
long long n,ans,i;
while(scanf("%lld",&n)!=EOF){
ans=0;
for(i=1;i*i<=n;++i){
if(n%i==0){
if(i*i==n){
ans+=i*Euler(i);
}
else {
ans+=i*Euler(n/i);
ans+=(n/i)*Euler(i);
}
}
}
printf("%lld\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BZOj2705 SDOI2012Lon