题意:
给一个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<iostream>
#include<algorithm>
#include<cstdio>
#define MOD 1000000007
using namespace std;
long long euler(long long n)//求n的欧拉函数
{
long long ans=1,i;
for(i=2;i*i<=n;i++)
if (n%i==0)
{
ans*=i-1; n/=i;
while(n%i==0)
{
ans*=i;
n/=i;
}
}
if (n>1)
{
ans*=n-1;
}
return ans;
}
int main()
{
long long n;
while(scanf("%lld",&n),n)
{
if(n==2)
{
printf("0\n");
continue;
}
long long ans=n*(euler(n)/2);
ans=ans%MOD;
ans=n*(n+1)/2-ans-n;
ans=ans%MOD;
printf("%lld\n",ans);
}
return 0;
}