欧拉函数入门合集(模板)

首先我们先看一下poj2407hdu1286,这两个题几乎完全一样,是利用朴素的方法求欧拉函数,只不过poj要开long long而已

代码(以poj为例)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
long long getphi(long long x){
      long long i,j,k,res=x;
      for(long long i=2;i*i<=x;i++){
          if(x%i==0)res=res*(i-1)/i;
          while(x%i==0)x/=i;
      }
      if(x>1)res=(x-1)*res/x;
      return res;
}
int main()
{     long long n,m,i,j,k,x;
      cin>>x;
      while(x!=0){
          cout<<getphi(x)<<endl;
          cin>>x;
      }
      return 0;
}
我们观察到hdu上的数据范围比较小,所以我们可以用线性筛欧拉函数的方法做一下

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int phi[400000],vis[400000],prime[400000],cnt;
int main()
{     int n,m,i,j,k;
      for(i=2;i<=32767;i++)
         if(!vis[i]){
             for(j=i;j<=32767;j+=i)
                vis[j]=1;
             prime[++cnt]=i;
         }
      for(i=1;i<=32767;i++)
         phi[i]=i;
      for(j=1;j<=cnt;j++)
         for(i=prime[j];i<=32767;i+=prime[j])
            phi[i]=phi[i]*(prime[j]-1)/prime[j];
      cin>>n;
      for(i=1;i<=n;i++){
           cin>>m;
           cout<<phi[m]<<endl;
      }
      return 0;
}
我们再看一下poj2478,这道题经过分析就是求前n个数的欧拉函数,代码与上面几乎一样

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
const int n=1e6;
long long prime[n+5],phi[n+5],cnt,vis[n+5],pre[n+5];
int main()
{     long long x,i,j,k;
      for(i=2;i<=n;i++)
         if(!vis[i]){
             prime[++cnt]=i;
             for(j=i*2;j<=n;j+=i)
                vis[j]=1;
         }
      for(i=2;i<=n;i++)phi[i]=i;
      for(i=1;i<=cnt;i++)
         for(j=prime[i];j<=n;j+=prime[i])
            phi[j]=phi[j]*(prime[i]-1)/prime[i];
      pre[1]=0;
      for(i=2;i<=n;i++)pre[i]=pre[i-1]+phi[i];
      scanf("%lld",&x);
      while(x){
          printf("%lld\n",pre[x]);
          scanf("%lld",&x);
      }
      return 0;
}

猜你喜欢

转载自www.cnblogs.com/yzxverygood/p/9057844.html