欧拉函数,讲述一个数n以及算出比n小的并且与n互质的数的个数,还可以欧拉筛打表每一个小于n的互质数的个数
#includeusing namespace std; typedef long long ll; int k; int euler(int n){//计算比n小的且与n互质的数的个数 int m=int(sqrt(n+0.5)); int ans=n; for(int i=2;i<=m;++i){ if(n%i==0){ ans=ans/i*(i-1); while(n%i==0)n/=i; } } if(n>1)ans=ans/n*(n-1); return ans; } int phi[10005]; void phi_table(int n){//打表欧拉函数(O(nloglogn)) for(int i=2;i<=n;++i)phi[i]=0; phi[1]=1; for(int i=2;i<=n;++i) if(!phi[i]){ for(int j=i;j<=n;j+=i){ if(!phi[j])phi[j]=j; phi[j]=phi[j]/i*(i-1); } } } int main() { cout< 欧拉加素数线性筛
int v[maxn],prime[maxn],phi[maxn],cnt; void euler(int n)//打表欧拉函数及素数(O(n)) { for(register int i=2; i<=n; ++i){ if(!v[i]) v[i]=i,prime[++cnt]=i,phi[i]=i-1; for(register int j=1; j<=cnt; ++j){ if(prime[j]>v[i]||prime[j]>n/i) break; v[i*prime[j]]=prime[j]; phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]); } } }