Calculation 2
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem 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解题思路:解这道题之前先看一个证明:给出一个N,求1..N中与N互质的数的和
if gcd(n,i)=1 then gcd(n,n-i)=1 (1<=i<=n)
反证法:
如果存在K!=1使gcd(n,n-i)=k,那么(n-i)%k==0
而n%k=0
那么必须保证i%k=0
k是n的因子,如果i%k=0那么 gcd(n,i)=k,矛盾出现;
于是问题变的非常简单: ANS=N*phi(N)/2
i,n-i总是成对出现,并且和是n这道题是求与N非互质的数之和,那么1到N-1的和(因为不能有N)减去ANS即是答案。。AC:#include<iostream> #include<cstdio> using namespace std; typedef __int64 LL; const int mod = 1000000007; LL euler(LL n) { LL res = n; for(int i = 2; i * i <= n; i++) { if(n % i == 0) { res = res / i * (i - 1); while(n % i == 0) n /= i; } } if(n > 1) res = res / n * (n - 1); return res; } int main() { LL n; while(scanf("%I64d",&n)!=EOF && n) { if(n == 1) { printf("0\n"); continue; } LL num = euler(n); //与n互质的个数 LL sum = ((n-1)*n/2 - num*n/2)%mod; printf("%d\n",sum); } return 0; }