题意 : 求小于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 }
时间: 2024-08-03 18:32:55