Calculation 2
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3141 Accepted Submission(s): 1300
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互质的数之和。用欧拉函数先求出与n互质的数之和,再用总和减去就行了。Hint: 欧拉函数求得的与n互质的值为n*ephi(n)/2;#include<stdio.h> #include<string.h> #include<math.h> #define M 1000000007 long long ephi(long long n) { int m=(int)sqrt(n+0.5); long long ans=n; for(int i=2;i<=m;i++) if(n%i==0) { ans=ans/i*(i-1); while(n%i==0) n/=i; } if(n>1) ans=ans/n*(n-1); return ans; } int main() { long long n; while(scanf("%lld",&n),n) { long long ans=((n*(n-1)/2)-((n*ephi(n)/2)))%M; printf("%lld\n",ans); } return 0; }