#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]);
        }
    }
}