Description
Given a positive integer N, your task is to calculate the sum of the positive integers less than N which are not coprime to N. A is said to be coprime to B if A, B share no common positive divisors except 1.
Input
For each test case, there is a line containing a positive integer N(1 ≤ N ≤ 1000000000). A line containing a single 0 follows the last test case.
Output
For each test case, you should print the sum module 1000000007 in a line.
Sample Input
3
4
0
Sample Output
0 2
简单思路:首先用一下欧拉函数Eluar(n)求一下1-n中与n互质的质因子的个数,然后就要用到下面简单的定理了:如果gcd(n,i)==1,那么就有gcd(n,n-i)==1;
于是题目的要求是要求小于n并且与n不互质的所有数的和,这里我们可以先求与n互质的所有数的和为sum=n*Eular(n)/2 (这里用到了上面的定理)。最后所有数的和 (n-1)*n/2 减去 sum 即可。
//User: ZXPxx
//Memory: 1604 KB Time: 0 MS
//Language: C++ Result: Accepted
#include<cstdio>
const int mod=1000000007;
int eular(int n)
{
int cnt=1,i;
for(i=2;i*i<=n;i++)
if(n%i==0)
{
cnt*=i-1;
n/=i;
while(n%i==0)
{
n/=i;
cnt*=i;
}
}
if(n>1)
cnt*=(n-1);
return cnt;
}
int main()
{
__int64 n;
while(~scanf("%I64d",&n),n)
{
__int64 ans=(n-1)*n/2;
__int64 sum=n*eular(n)/2;
ans-=sum;
printf("%I64d\n",ans%mod);
}
return 0;
}