zoukankan      html  css  js  c++  java
  • 欧拉函数入门合集(模板)

    首先我们先看一下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 ",pre[x]);
              scanf("%lld",&x);
          }
          return 0;
    }

  • 相关阅读:
    CPP STL学习笔记
    CPP 设计模式学习
    blackarch 安装指南
    通过 Http 请求获取 GitHub 文件内容
    实践
    升级
    部署-MySql 之Linux篇
    数据库
    RxJs
    Vue
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9057844.html
Copyright © 2011-2022 走看看