BIT1055The Euler function

来源:互联网 发布:中文域名好吗 编辑:程序博客网 时间:2024/04/25 13:06

题意:

给a和b,求

f[a]+f[a+1]+....f[b]

f为对应的欧拉函数值

解法:

线性筛法,因为欧拉函数是积性函数

可用筛法计算欧拉函数值

若p ∤ i,ϕ(p*i)=(p-1)*ϕ(i)
若p|i, ϕ(p*i)=p*ϕ(i)

根据以上两个式子将1到10^6内所有数的欧拉函数值通过筛法算出来

然后用ans数组代表

ans[i]=f[1]+f[2]+...f[ans]

最后输入a和b时,结果就是

ans[b]-ans[a]+f[a]

#include<iostream>#include<algorithm>#include<cstdio>using namespace std;#define MAX 1000100long long f[MAX];//欧拉函数的值void init()//筛出MAX以内的所有数的欧拉函数值{memset(f,0,sizeof(f));f[1]=1;for(long long i=2;i<MAX;i++){if(f[i]==0)//i为素数{f[i]=i-1;for(long long j=1;j*i<MAX;j++)//若p ∤ i,ϕ(p*i)=(p-1)*ϕ(i)//若p|i, ϕ(p*i)=p*ϕ(i)//p为素数,i为倍数{if(j%i==0){f[i*j]=i*f[j];}else{f[i*j]=(i-1)*f[j];}}}}}long long ans[MAX];int main(){init();long long a,b;ans[1]=f[1];for(long long i=2;i<MAX;i++){ans[i]=ans[i-1]+f[i];}while(~scanf("%d %d",&a,&b)){printf("%lld\n",ans[b]-ans[a]+f[a]);}return 0;}


原创粉丝点击