Calculation 2
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2246 Accepted Submission(s): 958
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/*求1--n之间与n不互质的数之和 欧拉函数延生:n的质因子数之和=phi(n)*n/2 能搜到证明过程,反正连欧拉函数都不会证明还 加油!!! Time:2014-10-14 17:00 */ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define mod 1000000007 __int64 Eular(__int64 n){ int ans=n; for(int i=2;i*i<=n;i++){ if(n%i==0){ ans-=ans/i; while(n%i==0)n/=i; } }if(n!=1)ans-=ans/n; return ans; } int main(){ __int64 n; while(scanf("%I64d",&n),n){ if(n<=1){ printf("0\n"); }else{ //前n-1项和-质因子个数 //printf("%d\n",Eular(n)); printf("%I64d\n",(n*(n-1)/2-Eular(n)*n/2)%mod); } } return 0; }