zoukankan      html  css  js  c++  java
  • 欧拉函数,讲述一个数n以及算出比n小的并且与n互质的数的个数,还可以欧拉筛打表每一个小于n的互质数的个数

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int k;
    int euler(int n){//计算比n小的且与n互质的数的个数
        int m=int(sqrt(n+0.5));
        int ans=n;
        for(int i=2;i<=m;++i){
            if(n%i==0){
                ans=ans/i*(i-1);
                while(n%i==0)n/=i;
            }
        }
        if(n>1)ans=ans/n*(n-1);
        return ans;
    }
    int phi[10005];
    void phi_table(int n){//打表欧拉函数(O(nloglogn))
        for(int i=2;i<=n;++i)phi[i]=0;
        phi[1]=1;
        for(int i=2;i<=n;++i)
            if(!phi[i]){
                for(int j=i;j<=n;j+=i){
                    if(!phi[j])phi[j]=j;
                    phi[j]=phi[j]/i*(i-1);
                }
            }
    }
    
    int main()
    {
        cout<<euler(5)<<" "<<euler(8)<<" "<<euler(18)<<endl;
        phi_table(10000);
        for(int i=1;i<=20;++i)cout<<phi[i]<<endl;
        return 0;
    }
    

     欧拉加素数线性筛

    int v[maxn],prime[maxn],phi[maxn],cnt;
    void euler(int n)//打表欧拉函数及素数(O(n))
    {
        for(register int i=2; i<=n; ++i){
            if(!v[i])
                v[i]=i,prime[++cnt]=i,phi[i]=i-1;
            for(register int j=1; j<=cnt; ++j){
                if(prime[j]>v[i]||prime[j]>n/i)
                    break;
                v[i*prime[j]]=prime[j];
                phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]);
            }
        }
    }
    

      

     

  • 相关阅读:
    连接池——tomcat自带连接池。
    jsp小记
    结合properties配置文件优化jdbc连接工具类
    StringBuffer
    多重继承关系初始化顺序及初始化
    Error
    算法:插入排序
    算法:冒泡排序
    算法:选择排序
    注册Activity
  • 原文地址:https://www.cnblogs.com/lengsong/p/11348217.html
Copyright © 2011-2022 走看看