题目地址:​​点击打开链接​

思路:题目是要求小于n且不与n互素的和对1000000007取模,我们可以把可以用1到n-1的和(n-1)*n/2减去小于n且与n互素的和再对1000000007取模即可,这里要用到一个公式如果gcd(n,i)=1,则gcd(n,n-i)=1,用欧拉函数求出小于n且与n互素的个数为sum,则共有sum/2对数,他们的和为n,即小于n且与n互素的数的和为n*sum/2

AC代码:

#include <iostream>
#include <cstdio>

using namespace std;

long long fun(long long n)
{
int i;
long long rea = n;
for(i=2; i*i <=n; i++)
{
if(n % i == 0)
{
rea -= rea / i;
while(n % i == 0)
n /= i;
}
}
if(n > 1)
rea -= rea / n;
return rea;
}

int main()
{
long long m,sum = 0;
while(scanf("%I64d",&m) && m)
{
sum = ((m-1) * m / 2 - m * fun(m) / 2) % 1000000007;//如果怕溢出先除以2则需要判断第一个要除以的数能否被2整除,不然会出错
printf("%I64d\n",sum);
}
return 0;
}