互质是公约数只有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); }