poj 2478(快速求解欧拉函数优化版。。。)

之前一直在用

void get_eular() {
    memset(eul,0,sizeof(eul));
    eul[1]=1;
    for(int i=2;i<maxlen;i++)
        if(!eul[i])
            for(int j=i;j<maxlen;j+=i){
                if(!eul[j]) eul[j]=j;
                eul[j]=eul[j]/i*(i-1);
            }
    eul[1]=0;eul[2]=1;
    for(int i=3;i<maxlen;i++){
        eul[i]+=eul[i-1];
    }
}
来求前n项的欧拉函数值。。。后来发现了一个比较好的优化。。。。。请看这里的一个讲解  http://www.cnblogs.com/suno/archive/2008/02/04/1064368.html 

然后按照优化方案来写程序。。。进入了100ms以内了。。。。嗨皮。。


#include <iostream>
#include <cstdio>
#include<cstring>
using namespace std;
const int maxlen=1000010;
long long eul[maxlen];
int pri[maxlen],f[maxlen],isprim[maxlen],p=0;
inline void get_prim(){
    memset(isprim,1,sizeof(isprim));
    for(int i=2;i<maxlen;i++){
        if(isprim[i]) pri[p++]=i;
        for(int j=0;j<p && i*pri[j]<maxlen;j++){
            int k=pri[j]*i;
            isprim[k]=0,f[k]=pri[j]; // 得到k的最小素因子
            if(i%pri[j]==0) break;
        }
    }
}
inline void get_eul(){
    for(int i=2;i<maxlen;i++)
        if(isprim[i]) eul[i]=i-1;
        else{
            int k=i/f[i];
            if(k%f[i]==0) eul[i]=eul[k]*f[i];
            else eul[i]=eul[k]*(f[i]-1);
        }
    for(int i=3;i<maxlen;i++)
        eul[i]+=eul[i-1];
}
int main(int argc, char** argv) {
    int m;
    get_prim();
    get_eul();
    while(scanf("%d",&m) && m)
        printf("%lld\n",eul[m]);
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值