复杂度O(n)

bool v[100000010];
int prime[100010],tot=0;
void init(int n)
{
	v[1]=1;
	for(int i=2;i<=n;i++)
	{
		if(!v[i])	prime[++tot]=i;
		for(int j=1;j<=tot&&i*prime[j]<=n;j++)
		{
			v[i*prime[j]]=1;
			if(i%prime[j]==0)	break;
		}
	}
	return ;
}

模版:https://www.luogu.com.cn/problem/P3383

bool v[maxn];
int prim[maxn],phi[maxn],tot=0;
void eular()
{
	v[1]=1;
	phi[1]=1;
	for(int i=2;i<=n;i++)
	{
		if(!v[i])
		{
			prim[++tot]=i;
			phi[i]=i-1;
		}
		for(int j=1;j<=tot&&i*prim[j]<=n;j++)
		{
			v[i*prim[j]]=1;
			if(i%prim[j]==0)
			{
				phi[i*prim[j]]=phi[i]*prim[j];
				break;
			}
			phi[i*prim[j]]=phi[i]*(prim[j]-1);
		}
	}
	return ;
}