求歐拉函數(模板)

互質是公約數只有1的兩個整數,叫作互質整數函數

 

1.根據定義求解spa

 好比1~6中與6互質的數只有1,5,因此6的歐拉函數是23d

 

 求一個時間複雜度:O(sqrt(n))求n個就是 n*sqrt(n)code

               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)blog

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

         

      i % primes[j] != 0:primes[j]不是i的質因子,只是primes[j] * i的最小質因子,因此多了一個質因子class

      

 

 

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);
                
        }
相關文章
相關標籤/搜索