杜教筛 & Min25 筛

发现这个东西很容易忘,果然还是理解不够吧,写一篇博客方便以后复习。

杜教筛

目的是要求 \(S(n)=\sum_{i=1}^n f(i)\)

我们需要构造两个函数 \(g,h\) 满足 \(f * g=h\),其中 \(h\) 是一个积性函数且能快速求和。

考虑求 \(\sum_{i=1}^n \sum_{d|i} f(d) g(\dfrac{i}{d})=\sum_{i=1}^n h(i)=\sum_{i=1}^n g(i) S(\left\lfloor\dfrac{n}{i}\right\rfloor)\)

我们发现在上述式子中 \(\sum_{i=1}^n h(i)-\sum_{i=2}^n g(i) S(\left\lfloor\dfrac{n}{i}\right\rfloor)=g(1)S(n)\)

所以 \(S(n)=\dfrac{\sum_{i=1}^n h(i)-\sum_{i=2}^n g(i) S(\left\lfloor\dfrac{n}{i}\right\rfloor)}{g(1)}\)

然后就做完了。

列举一些常见的求和。

  • \(\sum_{i=1}^n \mu(i)\),配 \(g(i)=1\) 即可。
  • \(\sum_{i=1}^n \phi(i)\),配 \(g(i)=1\) 即可。
  • \(\sum_{i=1}^n \mu(i) \times i\),配 \(g(i)=i\) 即可。
  • \(\sum_{i=1}^n \phi(i) \times i\),配 \(g(i)=i\) 即可。

\(\text{Min25}\)

\(f(p^c)\) 能快速求值。

\(g(n,j)=\sum_{i=1}^n [minprime(i) > prime_j \text{ or } i \in \text{prime}] f(i)\)
\(h(n,j)=\sum_{i=1}^n [minprime(i) \geq prime_j] f(i)\)

先来考虑 \(g\) 的转移。

这个时候分为两种情况。

  • \(prime_j^2 > n\),那么有 \(g(n,j)=g(n,j-1)\),原因显然。
  • \(prime_j^2 \leq n\),那么有 \(g(n,j)=g(n,j-1)-f(prime_j)(g(\left\lfloor\dfrac{n}{prime_j}\right\rfloor,j-1)-g(prime_j-1,j-1))\)

接下来考虑怎么求 \(h(n,j)\)

先考虑质数贡献,显然有贡献的为大于等于 \(prime_j\) 的质数,也就是 \(g(n,|\text{prime}|)-\sum_{i=1}^{j-1}f(prime_i)\)

接下来考虑合数贡献,我们枚举合数的最小质因子及其次数。

\(\text{contribution}=\sum_{i=j}^{\text{|prime|}} \sum_{t \geq 0} f(prime_i^t) h(\left\lfloor \dfrac{n}{prime_i^t}\right\rfloor,i+1)+f(prime_i^{t+1})\)

最后要加上一个 \(f(prime_i^{t+1})\) 是因为不难发现 \(h(n,j)\) 不会算到 \(f(1)\) 的值,所以质数的次幂会算漏,因此补上。

所以 \(h(n,j)=g(n,|\text{prime}|)-\sum_{i=1}^{j-1}f(prime_i)+\text{contribution}\)

最后求的就是 \(h(n,0)+f(1)\)

posted @ 2023-06-02 15:13  OccDreamer  阅读(35)  评论(1)    收藏  举报