线性筛
线性筛
如果要线性筛一个函数,你需要支持这两件事:
- 已知\(f(i)、f(j)\),\(i\)是质数且与\(j\)互质,求\(f(ij)\)
- 已知\(f(i)、f(j)\),\(i\)是质数且整除\(j\),求\(f(ij)\)
如果\(f()\)是积性函数,那么第一件事就解决了。第二件事由于其特殊的性质,很多时候也可以轻松解决。
以下举例说明:
质数判定函数
- \(isprime(ij)=0\)
- \(isprime(ij)=0\)
欧拉函数
- \(\varphi(ij)=\varphi(i)\varphi(j)\)
- \(\varphi(ij)=i\cdot\varphi(j)\)
莫比乌斯函数
- \(\mu(ij)=\mu(i)\mu(j)\)
- 由于\(i\)是质数,也可以写为\(\mu(ij)=-\mu(j)\)
- \(\mu(ij)=0\)
积性函数的狄利克雷卷积函数
求筛:\(f(n)=\sum_{d|n}d^2\mu(d)\frac{n}{d}\)。\(n\le10^7\)。
由狄利克雷卷积的性质,f()是积性函数。因此我们只用考虑第二件事。
若\(n\)是质数,显然\(f(n)=n-n^2\)。
啊啊啊哦哦哦。哈哈哈去重庆。
所以,\(f(ij)=i\cdot f(j)\)。
来源BZOJ2693
埃拉托特尼斯筛
复杂度为\(O(nlog(log(n)))\),理论复杂度是线性筛的四点几倍(1e6 4.3倍,1e7 4.5倍,1e8 4.7倍),实际时间可能两三倍。