这是一道小于n,与n不互质的数求和公式,我们可以反过来做,先求欧拉函数的和,要用到一个公式:n*euler(u)/2;再用总和减去欧拉和!
代码如下:
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
const int maxn=1000000007;
__int64 euler(__int64 x)
{
int i;
__int64 res=x;
for(i=2; i<=(int)sqrt(x*1.0)+1; i++)//这里很容易写成i=1开始
{
if(x%i==0)
{
res=res/i*(i-1);
while(x%i==0)
x/=i;
}
}
if(x>1)
res=res/x*(x-1);
return res;
}
int main()
{
__int64 n;
__int64 m;
while(scanf("%I64d",&n)!=EOF&&n!=0)
{
m=(n*(n-1)/2)-(n*euler(n)/2);
m%=maxn;
printf("%I64d\n",m);
}
return 0;
}