小于等于n,且与n互质的因子sum= euler(n)*n/2
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
Author
Source
2010 ACM-ICPC Multi-University Training Contest(7)——Host by HIT
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod = 1000000007;
int euler(int n){ //返回euler(n)
int res=n,a=n;
for(int i=2;i*i<=a;i++){
if(a%i==0){
res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出
while(a%i==0) a/=i;
}
}
if(a>1) res=res/a*(a-1);
return res;
}
int main()
{
long long n;
long long ans;
int m;
while(cin>>n && n) {
ans=n*(n-1)/2%mod;
ans=(ans-euler(n)*n/2%mod+mod)%mod;
cout<<ans<<endl;
}
return 0;
}