发现这个东西很容易忘,果然还是理解不够吧,写一篇博客方便以后复习。
杜教筛
目的是要求 \(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)\)。
标签:prime,lfloor,text,Min25,rfloor,杜教,dfrac,sum From: https://www.cnblogs.com/OccasionalDreamer/p/17451852.html