筛法
线性筛(欧拉筛)求质数
void shai()
{
sign[0]=sign[1]=1;
for(int i=2;i<=N;i++){
if(!sign[i]) pri[++cnt]=i;
for(int j=1;j<=cnt;j++){
if(pri[j]*i>N)break;
sign[pri[j]*i]=1;
if(i%pri[j]==0)break;
}
}
}
欧拉函数 \(\varphi\)
由于线性筛找到了最小质因子,因此可以利用这个性质去求欧拉函数。
若 \(\frac{n}{p_1}\mod p_1\ne 0\),则有 \(\varphi(n)=(p_1-1)\times \varphi(\frac{n}{p_1})\)。
若 \(\frac{n}{p_1}\mod p_1 = 0\),则有 \(\varphi(n)=p_1\times \varphi(\frac{n}{p_1})\)。
其中 \(p_1\) 为 \(n\) 的最小质因子。
void shai()
{
sign[0]=sign[1]=1;
for(int i=2;i<=N;i++){
if(!sign[i]) pri[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt;j++){
if(pri[j]*i>N)break;
sign[pri[j]*i]=1,phi[pri[j]*i]=(i%pri[j]==0?pri[j]:pri[j]-1)*phi[i];
if(i%pri[j]==0)break;
}
}
}

浙公网安备 33010602011771号