HDU 3501 Calculation 2 (欧拉函数)

题目链接

题意 : 求小于n的数中与n不互质的所有数字之和。

思路 : 欧拉函数求的是小于等于n的数中与n互质的数个数,这个题的话,先把所有的数字之和求出来,再减掉欧拉函数中所有质数之和(即为eular(n)*n/2),得到的就是最终结果,所以也是模板题一道。

 1 //3501

 2 #include <iostream>

 3 #include <stdio.h>

 4 #include <stdlib.h>

 5 #include <string.h>

 6 #include <math.h>

 7 

 8 using namespace std;

 9 

10 int main()

11 {

12     long long x;

13     while (scanf("%I64d", &x) && x)

14     {

15         long long res = x;

16         long long temp = x ;

17         for (int i = 2 ; i < sqrt(x) + 1 ; i++)

18         {

19             if (x % i == 0 )

20             {

21                 res = res / i * (i -1);

22                 while (x % i ==0)

23                     x /= i; // 保证i一定是素数

24             }

25         }

26         if (x > 1)

27             res = res / x * (x -1);

28         long long sum = temp * (temp + 1)/2-temp ;

29         sum -= res*temp/2 ;

30         sum %= 1000000007  ;

31         printf("%I64d\n", sum);

32     }

33     return 0;

34 }
View Code

 

你可能感兴趣的:(HDU)