筛法

线性筛(欧拉筛)求质数

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;
		}
	}
}
posted @ 2025-03-14 16:25  all_for_god  阅读(16)  评论(0)    收藏  举报