您的位置:首页 > 其它

HDU 3501 Calculation 2---欧拉函数扩展

2014-05-08 15:20 253 查看
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<math.h>
#define N 32000
using namespace std;
bool h
;
int p[4000];

void prime()//筛选求素数
{
int cnt=1;
int i,j;
p[0]=2;
for(i=2;i<N;i+=2)
h[i]=1;
for(i=3;i<N;i+=2)
if(!h[i])
{
p[cnt++]=i;
for(j=i*i;j<N;j+=i)
h[j]=1;
}
}
__int64 solve(__int64  n)//求与小于n互质的数字的个数
{
int m=(int)sqrt(n*1.0);
__int64 r=n,tp=n;
int i;
for(i=0;p[i]<=m;i++)
if(n%p[i]==0)
{
tp=tp/p[i]*(p[i]-1);
while(n%p[i]==0) n/=p[i];
if(n==1) break;
}

if(n>1) tp=tp/n*(n-1);
return tp;
}
int main()// 欧拉公式的引伸:小于或等于n的数中,与n互质的数的总和为:φ(x) * x / 2。(n>1)
{
prime();
__int64 i,j,n;
while(scanf("%I64d",&n)!=EOF&&n)
{
__int64 k=solve(n);
k=k*n/2;
__int64 sum=n*(n-1)/2;
sum-=k;
printf("%I64d\n",sum%1000000007);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: