歐拉函數

1.歐拉篩法求素數函數

int ss(int n)//求小於n的素數個數
{
	int cnt=0;
	for(int i=2;i<n;i++){
		if(!vis[i]){
			prime[++cnt]=i;//若是這個數以前沒有被刪除,那麼這個數是素數 
		}
		for(int j=1;j<=cnt;j++){
			if(i*prime[j]>=n) break;
			vis[i*prime[j]]=1;
			if(i%prime[j]==0) break;
			//這種狀況下,這個數之後的必定會被以後的數刪除 
		} 
	}
	return cnt; 
}

 

 

2.歐拉函數求1~n中和n互質的個數blog

(1)直接求解class

int sol(int n){ //直接求解歐拉函數 
     int res=n;
	 int a=n;
     for(int i=2;i*i<=a;i++){
         if(a%i==0){
             res=res/i*(i-1);//先進行除法是爲了防止中間數據的溢出 
             while(a%i==0) a/=i;
         }
     }
     if(a>1) res=res/a*(a-1);
     return res;
}

 

(2)打表im

void sol(int n){ //打表求歐拉函數
     ans[1]=1;
     for(int i=2;i<=n;i++)
       ans[i]=i;
     for(int i=2;i<=n;i++)
        if(ans[i]==i)//若是這個數 
           for(int j=i;j<=n;j+=i)
              ans[j]=ans[j]/i*(i-1);//先進行除法是爲了防止中間數據的溢出 
}
相關文章
相關標籤/搜索