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;}