nlog(n)打表欧拉函数:
void Euler()
{
phi[1] = 1;
for(int i=2;i<N;i++)
{
if(!phi[i])
{
for(int j=i;j<N;j=j+i)
{
if(!phi[j])
phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
}
}
O(n)线性筛打表欧拉函数:
#include<cstdio>
using namespace std;
const int N = 1e6+10 ;
int phi[N], prime[N];
int tot;//tot计数,表示prime[N]中有多少质数
void Euler()
{
phi[1] = 1;
for(int i = 2; i < N; i ++)
{
if(!phi[i])
{
phi[i] = i-1;
prime[tot ++] = i;
}
for(int j = 0; j < tot && 1ll*i*prime[j] < N; j ++)
{
if(i % prime[j]) phi[i * prime[j]] = phi[i] * (prime[j]-1);
else
{
phi[i * prime[j] ] = phi[i] * prime[j];
break;
}
}
}
}