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;
}