转:http://blog.csdn.net/zhangwei1120112119/article/details/8568364
题意:
给一个n,求
少于或等于n的数中与n不互质的数的和
我们先求
少于或等于n的数中与n互质的数的和
对于i与n互素
gcd(n,i)=1
必有gcd(n,n-i)=1
设n的欧拉函数值为f[n]
则有f[n]个数与n互素,这些数两两相加必等于n
于是有答案为f[n]*n/2
#include<stdio.h>
#include<string.h>
#define ll long long
#define mod 1000000007
ll eular(ll n){
ll ret=1,i;
for (i=2;i*i<=n;i++)
if (n%i==0){
n/=i,ret*=i-1;
while (n%i==0)
n/=i,ret*=i;
}
if (n>1)
ret*=n-1;
return ret;
}
int main()
{
ll n;
while(scanf("%lld",&n),n)
{
ll t1=(n-1)*n/2;
ll t2=eular(n)*n/2;
ll sum=((t1-t2)+mod)%mod;
printf("%lld\n",sum);
}
}