POJ 2480 Longge's problem 欧拉函数—————∑gcd(i, N) 1<=i <=N
Longge's problem
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 6383 | Accepted: 2043 |
Description
Longge is good at mathematics and he likes to think about hard mathematical problems which will be solved by some graceful algorithms. Now a problem comes: Given an integer N(1 < N < 2^31),you are to calculate ∑gcd(i, N) 1<=i <=N.
"Oh, I know, I know!" Longge shouts! But do you know? Please solve it.
"Oh, I know, I know!" Longge shouts! But do you know? Please solve it.
Input
Input contain several test case.
A number N per line.
A number N per line.
Output
For each N, output ,∑gcd(i, N) 1<=i <=N, a line
Sample Input
2 6
Sample Output
3 15
Source
POJ Contest,Author:Mathematica@ZSU
1 /* 2 3 题意:∑gcd(i, N) 1<=i <=N。由于N 2^31. 4 刚开始想用欧拉求得1的个数,再求N的素因子,用容斥 5 来求解。发现,就算是求得的素因子,也不最大公约数。 6 7 HUD的一道题,提供了思路。 8 9 枚举吧。 10 if(N%i==0) 11 { 12 最大公约数为1的时候,有几个。欧拉值(N/1); 13 最大公约数为2的时候,有几个。欧拉值(N/2); 14 ..... 15 } 16 17 */ 18 19 #include<iostream> 20 #include<cstdio> 21 #include<cstdlib> 22 #include<cstring> 23 using namespace std; 24 25 26 __int64 Euler(__int64 n) 27 { 28 __int64 i,temp=n; 29 for(i=2;i*i<=n;i++) 30 if(n%i==0) 31 { 32 while(n%i==0) 33 n=n/i; 34 temp=temp/i*(i-1); 35 } 36 if(n!=1) 37 temp=temp/n*(n-1); 38 return temp; 39 } 40 41 int main() 42 { 43 __int64 n,i,sum,k; 44 while(scanf("%I64d",&n)>0) 45 { 46 sum=0; 47 for(i=1;i*i<=n;i++) 48 { 49 if(n%i==0) 50 sum=sum+Euler(n/i)*i; 51 k=n/i; 52 if(n%k==0 && k!=i) 53 sum=sum+Euler(n/k)*k; 54 } 55 printf("%I64d\n",sum); 56 } 57 return 0; 58 }