题目大意:给出一个数字N(N<10^9),求所有小于等于n的数中与n不互质的数的和
考察点:数论
思路分析:与n不互质的数的和我们不太好求,反过来,求与n互质的数的和我们就可以利用欧拉函数来求了。
在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。
那么欧拉函数我们该如何求呢,欧拉函数有几条性质:http://baike.baidu.com/view/107769.htm
利用欧拉函数的性质,我们可以参考这篇文章中介绍的方法http://blog.youkuaiyun.com/yuanchuanshun/article/details/6168342,就能在比较短的时间内出结果了
#include<stdio.h>
long long oula(long long n)
{
long long ou;
int i;
ou=1;
for (i=2;i*i<=n;i++)
if (n%i==0)
{
ou=ou*(i-1);n=n/i;
while (n%i==0)
{
n=n/i;
ou=ou*i;
}
}
if (n>1) ou=ou*(n-1);
return ou;
}
int main()
{
long long ans,n;
scanf("%lld",&n);
while (n!=0)
{
if (n==2) printf("0\n");
else{
ans=oula(n);
ans=(n*(ans/2))%1000000007;
ans=n*(n+1)/2-ans-n;
ans=ans%1000000007;
printf("%lld\n",ans);}
scanf("%lld",&n);
}
return 0;
}