#include <bits/stdc++.h>
using 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<<euler(5)<<" "<<euler(8)<<" "<<euler(18)<<endl;
phi_table(10000);
for(int i=1;i<=20;++i)cout<<phi[i]<<endl;
return 0;
}
欧拉加素数线性筛
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]);
}
}
}