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.  

Input

Input contain several test case.  
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 }

 

你可能感兴趣的:(long)