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);//先進行除法是爲了防止中間數據的溢出 }