您的位置:首页 > 其它

hdu-Calculation 2(欧拉函数)

2014-04-07 17:26 477 查看
众所周知 若(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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: