您的位置:首页 > 其它

HDU2824 The Euler function(欧拉函数)

2016-02-05 22:10 267 查看
题目求φ(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[1]=1;
int tot=0;
for(long long i=2; i<MAXN; ++i){
if(!vis[i]){
prime[tot++]=i;
phi[i]=i-1;
}
for(int j=0; j<tot; ++j){
if(i*prime[j]>MAXN) break;
vis[i*prime[j]]=1;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}else{
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
}
int main(){
euler();
for(int i=2; i<MAXN; ++i) phi[i]+=phi[i-1];
int a,b;
while(~scanf("%d%d",&a,&b)){
printf("%lld\n",phi[b]-phi[a-1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: