题目求φ(a)+φ(a+1)+...+φ(b-1)+φ(b)。
用欧拉筛选法O(n)计算出n以内的φ值,存个前缀和即可。
- φ(p)=p-1(p是质数),小于这个质数且与其互质的个数就是p-1;
- φ(p*a)=(p-1)*φ(a)(p是质数且p不能整除a),因为欧拉函数是积性函数,φ(p*a)=φ(p)*φ(a);
- φ(p*a)=p*φ(a)(p是质数且p|a),不知怎么理解。。
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 3000000
long long phi[MAXN];
int prime[MAXN];
bool vis[MAXN];
void euler(){
phi[]=;
int tot=;
for(long long i=; i<MAXN; ++i){
if(!vis[i]){
prime[tot++]=i;
phi[i]=i-;
}
for(int j=; j<tot; ++j){
if(i*prime[j]>MAXN) break;
vis[i*prime[j]]=;
if(i%prime[j]==){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}else{
phi[i*prime[j]]=phi[i]*(prime[j]-);
}
}
}
}
int main(){
euler();
for(int i=; i<MAXN; ++i) phi[i]+=phi[i-];
int a,b;
while(~scanf("%d%d",&a,&b)){
printf("%lld\n",phi[b]-phi[a-]);
}
return ;
}