zoukankan      html  css  js  c++  java
  • 欧拉函数的求法

    欧拉函数的求法

    证明过程暂不讨论

    单个求欧拉函数

    long long eular(long long n)
    {
        long long ans=n;
        for(int i=2;i*i<=n;++i)
        {
            if(n%i==0)
            {
                ans-=ans/i;
                while(n%i==0)
                    n/=i;
            }
        }
        if(n>1)
            ans-=ans/n;
        return ans;
    }
    

    筛法求欧拉函数

    const int maxn=1e5;
    const int branch=26;
    const int inf=0x3f3f3f3f;
    const int MOD=1e6+7;
    int euler[maxn+10];
    void getEuler()
    {
        mset(euler,0);
        euler[1]=1;
        for(int i=2; i<=maxn; ++i)
            if(!euler[i])
                for(int j=i; j<=maxn; j+=i)
                {
                    if(!euler[j])
                        euler[j]=j;
                    euler[j]=euler[j]/i*(i-1);
                }
    }
    

    用素因子求欧拉函数

    #include<cstdio>
    #include<algorithm>
    #include<string>
    #include<cstring>
    #include<iostream>
    #include<iomanip>
    #include<map>
    #define mset(a,b)   memset(a,b,sizeof(a))
    using namespace std;
    typedef unsigned long long ull;
    typedef long long ll;
    const int maxn=1e6;
    const int branch=26;
    const int inf=0x3f3f3f3f;
    const int MOD=1e6+7;
    int book[maxn+10],prime[(int)1e5+10];
    int top;
    void init()//求出100w以内的所有素因子
    {
        top=0;
        book[0]=book[1]=1;
        for(int i=2;i*i<=maxn;++i)
            if(!book[i])
        {
            for(int j=i*i;j<=maxn;j+=i)
                book[j]=1;
        }
        for(int i=2;i<=maxn;++i)
            if(!book[i])
                prime[top++]=i;
    }
    int phi(int val)//求1~n中与n互质的个数
    {
        int ans=val;
        for(int i=0;prime[i]*prime[i]<=val;++i)
        {
            if(!(val%prime[i]))
            {
                ans=ans/prime[i]*(prime[i]-1);
                while(!(val%prime[i]))
                {
                    val/=prime[i];
                }
            }
        }
        if(val>1)
            ans=ans/val*(val-1);
        return ans;
    }
    

    线性筛(同时得到欧拉函数和素数表)

    bool check[maxn+10];
    int phi[maxn+10];
    int prime[maxn+10];
    int tot;//素数的个数
    void phi_and_prime_table(int N)//1~n以内的所有素数  已经欧拉函数
    {
        memset(check,false,sizeof(check));
        phi[1]=1;
        tot=0;
        for(int i=2;i<=N;++i)
        {
            if(!check[i])
            {
                prime[tot++]=i;
                phi[i]=i-1;
            }
            for(int j=0;j<tot;++j)
            {
                if(i*prime[j]>N) break;
                check[i*prime[j]]=true;
                if(i%prime[j]==0)
                {
                    phi[i*prime[j]]=phi[i]*prime[j];
                    break;
                }
                else
                {
                    phi[i*prime[j]]=phi[i]*(prime[j]-1);
                }
            }
        }
    }
    
  • 相关阅读:
    Study From DevOps 学习交流会议
    GS 服务器超时时间设置
    k8s 实验过程中遇到的两个小问题 端口 和 批量删除Error的pods
    这两天学到的简单Linux的命令
    Prometheus 和 Grafana的简单学习
    jenkins 添加 k8s 云
    常用的cpl 命令 运行直接打开控制台的简单方法
    [转贴] VIM 常用快捷键 --一直记不住
    [转载] 什么是istio 官网内容
    微软补丁201807补丁惹祸
  • 原文地址:https://www.cnblogs.com/dchnzlh/p/10427274.html
Copyright © 2011-2022 走看看