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 0Sample 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; }