题意:
给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 1000100
long 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;
}