zoukankan      html  css  js  c++  java
  • 求欧拉函数(模板)

    互质是公约数只有1的两个整数,叫做互质整数

    1.根据定义求解

     比如1~6中与6互质的数只有1,5,所以6的欧拉函数是2

     求一个时间复杂度:O(sqrt(n))求n个就是 n*sqrt(n)

                   long res=n;
                            for(int i=2;i<=n/i;i++){
                                    if(n%i==0){
                                            res=res*(i-1)/i;
                                            while(n%i==0) n/=i;
                                    }
                            }
                            if(n>1) res=res*(n-1)/n;
                            System.out.println(res);

    2.筛法求欧拉函数,时间复杂度:O(n)

           i % primes[j] == 0时:primes[j]是i的最小质因子,也是primes[j] * i的最小质因子,也就是i和i * prime[j]有相同的质因子

             

          i % primes[j] != 0:primes[j]不是i的质因子,只是primes[j] * i的最小质因子,所以多了一个质因子

          

    static final int N=1000005;
            static int prime[]=new int[N];
            static boolean vis[]=new boolean[N];
            static int phi[]=new int[N];
            static int cnt,n;
            static void get_eulers(){
                    phi[1]=1;//1. 1的欧拉函数为1
                    for(int i=2;i<N;i++){
                            if(!vis[i]){
                                    prime[cnt++]=i;
                                    phi[i]=i-1;//2.质数的欧拉函数为i-1
                            }
                            for(int j=0;j<cnt&&prime[j]<N/i;j++){
                                    vis[prime[j]*i]=true;
                                    if(i%prime[j]==0) {
                                            phi[prime[j]*i]=phi[i]*prime[j];//3.如果prime[j]是i的最小质因子
                                            break;
                                    }
                                    else{
                                            phi[prime[j]*i]=phi[i]*(prime[j]-1);//4.不是最小质因子
                                    }
                            }
                    }
                    int res=0;
                    for(int i=1;i<=n;i++) res+=phi[i];
                    System.out.println(res);
                    
            }
  • 相关阅读:
    Topshelf 搭建 Windows 服务
    Xamarin.Android 6.0以后开启权限方法
    使用ADB安装apk安装包
    C# 杀掉系统中的进程
    C# 使用CefSharp嵌入网站
    .Net Core 基于 SnmpSharpNet 开发
    C#实现ActiveMQ消息队列
    ActiveMQ 安装方法
    C# FluentFTP类上传下载文件
    .NET Core 之 Nancy 基本使用
  • 原文地址:https://www.cnblogs.com/qdu-lkc/p/12260122.html
Copyright © 2011-2022 走看看