线性筛

对于一个数论函数\(f\),当\(gcd(a,b)=1\)时,\(f(ab)=f(a)f(b)\),则称其为积性函数

对于一个数论函数\(f\),若 \(f(ab)=f(a)f(b)\),则称其为完全积性函数

线性筛流程:

① 处理素数\(p\)

② 处理\(i \times p\) ,其中\(i\)是任意正整数,\(p \nmid i\)\(p\) 是素数,\(p\)\(i \times p\)的最小素因子

③ 处理\(i \times p\),其中\(i\)是任意正整数,\(p \mid i\)\(p\)是素数,\(p\)\(i\)的最小素因子,\(p\)\(i \times p\)的最小素因子

应用举例:

欧拉函数\(φ(x)\)表示\([1, x]\)里的所有整数中,与\(x\)互质的数的个数

\(φ(p)=p-1\)\(p\)为素数)

\(φ(n)=n\Pi \frac{p_i-1}{p_i}\)

\(φ(p)=p-1\)

\(φ(i \times p)=φ(i) \times φ(p)=φ(i) \times (p-1)\)

\(φ(i \times p)=np\Pi \frac{p_i-1}{p_i}=p \times φ(i)\)

\(code:\)

phi[1]=1;
for(ll i=2;i<=n;++i)
{
	if(!tag[i])
	{
		pri[++tot]=i;
		phi[i]=i-1;
	}
	for(ll j=1;j<=tot;++j)
	{
		ll k=i*pri[j];
		if(k>n) break;
		tag[k]=true;
	    if(i%pri[j]!=0) 
			phi[k]=phi[i]*phi[pri[j]];
		else
		{
			phi[k]=phi[i]*pri[j];
			break;
		}
	}
}
posted @ 2020-01-22 21:03  lhm_liu  阅读(127)  评论(0编辑  收藏  举报