Bzoj 2705: [SDOI2012]Longge的问题 欧拉函数,数论
2705: [SDOI2012]Longge的问题
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1959 Solved: 1229
[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
题解:
直接欧拉函数即可。。。(注意:不要用线性筛,要用时再算欧拉函数。。。)
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 LL lys,ys[2010],n; 5 void getys() 6 { 7 LL nn=(LL)sqrt(n),i; 8 lys=0; 9 for(i=1;i<=nn;i++) 10 { 11 if(n%i==0) 12 { 13 ys[++lys]=i; 14 if(i*i!=n)ys[++lys]=n/i; 15 } 16 } 17 } 18 LL phi(LL k) 19 { 20 LL kk=(LL)sqrt(k),k1=k,i; 21 for(i=2;i<=kk;i++) 22 { 23 if(k1%i==0) 24 { 25 k=(k/i)*(i-1); 26 while(k1%i==0)k1/=i; 27 } 28 } 29 if(k1!=1)k=(k/k1)*(k1-1); 30 return k; 31 } 32 int main() 33 { 34 LL k,i; 35 LL ans; 36 scanf("%lld",&n); 37 getys(); 38 ans=0; 39 for(i=1;i<=lys;i++) 40 { 41 if(n%ys[i]==0) 42 { 43 k=n/ys[i]; 44 ans+=(LL)phi(k)*ys[i]; 45 } 46 } 47 printf("%lld",ans); 48 return 0; 49 }