众所周知 若(n,x)= 1,则 (n,n-x)=1;
所以只需求出n的欧拉函数值,则1~n-1中与n互素的和为m = Euler(n)* n / 2;
那么不互素的和为n*(n-1)/ 2 - m;
#include<stdio.h>
#include<math.h>
typedef __int64 LL;
const LL mod = 1000000007;
LL Euler(LL x)
{
LL res = x;
for(int i = 2;i <= sqrt(x);i++)
{
if(x%i==0)
{
while(x%i==0) x/=i;
res = res/i*(i-1)%mod;
}
}
if(x > 1) res = res/x*(x-1)%mod;
return res;
}
int main()
{
LL n;
while(scanf("%I64d",&n),n)
{
LL m = Euler(n);
printf("%I64d\n",(((n*(n-1)/2)%mod - m*n/2%mod)+mod)%mod);
}
}