对正整数 n,欧拉函数是小于等于 n 的数中与 n 互质的数的个数
性质摘要
1. a,b互质, f(a*b) =f(a)*f(b)
2. f(x^a) = (x-1)* f(x^(a-1))
3. if i%j==0 f(i*j)= f(i) *j
4. if i%j !=0 f(i*j)=f(i) * (j-1)
根号复杂度的求法依据公式
void sov(int n){ int i,ans=n; for(i=2;i*i<=n;i++){ if(n%i==0){ ans=ans/i*(i-1); while(n%i==0) n/=i; } } if(n>1) ans=ans/n*(n-1); cout<<ans; }
#include <iostream> #include<vector> using namespace std ; void sov(int n){ int i,fi=1; for(i=2;i*i<=n;i++){ if(n%i==0){ fi*=i-1; n/=i ; while(n%i==0) fi*=i, n/=i; } } if(n>1) fi*= n-1; cout<<fi; } signed main(){ sov(1690) ; }
线筛求法,依据3,4
const int M=1e6; int vis[M+4],P[M+4],cnt; int fi[M+4]; void shai(int top){ cnt=0; fi[1]=1; for(int i=2;i<=top;i++){ if(vis[i]==0){ P[++cnt]=i; fi[i]=i-1; } for(int j=1;j<=cnt&&i*P[j]<=top;j++){ vis[i*P[j]]=1; if(i%P[j]==0){ fi[i*P[j]]=fi[i]*P[j]; break; } else fi[i*P[j]]=fi[i]*(P[j]-1); } } }