线性筛
对于一个数论函数\(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;
}
}
}