/*
*Time: 0 ms
*题目大意:
* 求1~n里面比n小,但是与n不互素的数的总和。
*解题思路:
* 利用欧拉函数即可求解,1~n比n小且与n互素的数的总和为
* sum(n) = n * phi(n) / 2;那么可以先求出1~n-1的总和,然后
* 减去sum(n)即可。
*/
![]()
View Code
1 #include <iostream>
2 #include <cmath>
3 using namespace std;
4
5 int jisuan(int x)
6 {
7 int i,res=x;
8 for(i=2;i<(int)sqrt(x*1.0)+1;i++)
9
10 if(x%i==0)
11 {
12 res=res/i*(i-1);
13 while(x%i==0)
14 x/=i;
15 }
16 if(x>1)
17 res=res/x*(x-1);
18 return res;
19 }
20
21 int main(void)
22 {
23 unsigned __int64 n;
24 while(scanf("%I64d", &n), n)
25 {
26 unsigned __int64 sum = n * (n + 1) / 2 - n, res;
27 res = sum - (n * jisuan(n) / 2);
28 printf("%I64d\n", res % 1000000007);
29 }
30 return 0;
31 }