hdu 2824 欧拉函数 O(nlogn) 和O(n)

来源:互联网 发布:qq飞车猛兽数据 编辑:程序博客网 时间:2024/05/20 09:21

裸题

O(nlogn):

#include <cstdio>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int maxn=3000000+100;int phi[maxn];void init() {    for(int i=2;i<maxn;i++) phi[i]=i;    for(int i=2;i<maxn;i++)        if(phi[i]==i)            for(int j=i;j<maxn;j+=i)                phi[j]=(phi[j]/i)*(i-1);}int main() {    int a,b;    init();    while(scanf("%d%d",&a,&b)!=EOF) {        ll ans=0;        for(int i=a;i<=b;i++) ans+=(ll)phi[i];        printf("%lld\n",ans);    }       return 0;}

O(n):

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;typedef long long ll;const int maxn=3000000+10;/*线性筛O(n)时间复杂度内筛出maxn内欧拉函数值*/int m[maxn],phi[maxn],p[maxn],pt;//m[i]是i的最小素因数,p是素数,pt是素数个数void init() {    phi[1]=1;    int N=maxn;    int k;    for(int i=2; i<N; i++) {        if(!m[i])//i是素数            p[pt++]=m[i]=i,phi[i]=i-1;        for(int j=0; j<pt&&(k=p[j]*i)<N; j++) {            m[k]=p[j];            if(m[i]==p[j]) { //为了保证以后的数不被再筛,要break                phi[k]=phi[i]*p[j];                /*这里的phi[k]与phi[i]后面的∏(p[i]-1)/p[i]都一样(m[i]==p[j])只差一个p[j],就可以保证∏(p[i]-1)/p[i]前面也一样了*/                break;            } else                phi[k]=phi[i]*(p[j]-1);//积性函数性质,f(i*k)=f(i)*f(k)        }    }}int main() {    int a,b;    init();    while(scanf("%d%d",&a,&b)!=EOF) {        ll ans=0;        for(int i=a; i<=b; i++) {            ans+=(ll)phi[i];        }        printf("%lld\n",ans);    }    return 0;}
原创粉丝点击