您的位置:首页 > 其它

BZOJ_P2705 [SDOI2012]Longge的问题(数论+欧拉函数)

2016-02-17 16:08 459 查看
BZOJ传送门

Time Limit: 3 Sec Memory Limit: 128 MB

Submit: 1868 Solved: 1169

[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

round1 day1



在根号n的时间内计算phi(n/d)

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