hdu3501

来源:互联网 发布:淘宝卖家怎么编辑宝贝 编辑:程序博客网 时间:2024/05/04 00:59
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3501
/***************************************题意:给定一个n,求出与n不互素的数的总和思想:欧拉函数的应用+gcd的应用如果gcd(n,a)=1,那么就有gcd(n,n-a)=1;因此,对于小于n的数,gcd(n,i)=gcd(n,n-i);这是由于gcd的唯一性决定的;sum(i)=sum(n-i);//sum()表示小于n的数中与n互素的数的和此时:i[0]+i[0]……i[k]=n-i[0]+n-i[1]+……n-i[k];//k可以有欧拉函数求得有:2*sum(k)=n*k所以:sum(i)=n*euler(n)/2;所以对于题意要求的就是前n项和-sum(k)***************************************/#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#define mod 1000000007using namespace std;__int64 euler(__int64 n){    __int64 ans=n;    for(int i=2; i<=sqrt(n*1.0); i++)    {        if(n%i==0)        {            ans=ans-ans/i;            do                n=n/i;            while(n%i==0);        }    }    if(n>1)        ans=ans-ans/n;    return ans;}int main(){    __int64 n,ans;    while(cin>>n,n)    {        ans=0;        ans=(n-euler(n)-1);        ans=(ans*n/2)%mod;        if(ans<0)ans+=mod;        cout<<ans<<endl;    }    return 520;}