地址:http://acm.bit.edu.cn/mod/programming/view.php?a=543
问小于等于n且不与n互质的数的和。(2 ≤ N ≤ 1000000000).
对于小于n且与n互质的数,因为若i与n互质那么n-i也与n互质,故这些数两两成对,每对和为n,一共φ(x)/2对,和为φ(x)/2*n.再加上n,得小于等于n且与n互质的数之和为φ(x)/2*n+n.
然后用总和减去既得答案。
结论题~
#include<iostream>
using namespace std;
#define ll __int64
#define MOD 1000000007
int main()
{
ll n;
while(scanf("%I64d",&n),n)
{
ll ans=n,tn=n;
for(int i=2;i*i<=n;i++)
{
if(n%i==0) ans=ans/i*(i-1),n/=i; //必然是质因数
while(n%i==0) n/=i;
}
if(n>1) ans=ans/n*(n-1);
printf("%I64d\n",(tn*(tn+1)/2-ans*tn/2-tn)%MOD);
}
return 0;
}