2705: [SDOI2012]Longge的问题
Submit: 4064 Solved: 2596
[Submit][Status][Discuss]
Description
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
Input
一个整数,为N。
Output
一个整数,为所求的答案。
Sample Input
6
Sample Output
15
HINT
0<N<=2^32。
2019.1.1新加数据一组。
欧拉函数
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 #define LL long long 6 7 int eular(LL n) 8 { 9 LL ret=n; 10 LL nn=sqrt(n); 11 for(LL i=2;i<=nn;i++) 12 { 13 if(n%i==0) 14 ret=ret/i*(i-1); 15 while(n%i==0) n/=i; 16 } 17 if(n>1) ret=ret/n*(n-1); 18 return ret; 19 } 20 21 LL n,ans; 22 23 int main() 24 { 25 scanf("%lld",&n); 26 LL nn=sqrt(n); 27 for(LL i=1;i<=nn;i++) 28 { 29 if(n%i==0) ans+=i*eular(n/i)+(n/i)*eular(i); 30 } 31 if(nn*nn==n) ans-=eular(nn)*nn; 32 printf("%lld",ans); 33 return 0; 34 }