发现这个东西很容易忘,果然还是理解不够吧,写一篇博客方便以后复习。
杜教筛
目的是要求 S(n)=∑ni=1f(i)。
我们需要构造两个函数 g,h 满足 f∗g=h,其中 h 是一个积性函数且能快速求和。
考虑求 ∑ni=1∑d|if(d)g(id)=∑ni=1h(i)=∑ni=1g(i)S(⌊ni⌋)。
我们发现在上述式子中 ∑ni=1h(i)−∑ni=2g(i)S(⌊ni⌋)=g(1)S(n)。
所以 S(n)=∑ni=1h(i)−∑ni=2g(i)S(⌊ni⌋)g(1)。
然后就做完了。
列举一些常见的求和。
- ∑ni=1μ(i),配 g(i)=1 即可。
- ∑ni=1ϕ(i),配 g(i)=1 即可。
- ∑ni=1μ(i)×i,配 g(i)=i 即可。
- ∑ni=1ϕ(i)×i,配 g(i)=i 即可。
Min25 筛
f(pc) 能快速求值。
设 g(n,j)=∑ni=1[minprime(i)>primej or i∈prime]f(i)。
设 h(n,j)=∑ni=1[minprime(i)≥primej]f(i)。
先来考虑 g 的转移。
这个时候分为两种情况。
- prime2j>n,那么有 g(n,j)=g(n,j−1),原因显然。
- prime2j≤n,那么有 g(n,j)=g(n,j−1)−f(primej)(g(⌊nprimej⌋,j−1)−g(primej−1,j−1))。
接下来考虑怎么求 h(n,j)。
先考虑质数贡献,显然有贡献的为大于等于 primej 的质数,也就是 g(n,|prime|)−∑j−1i=1f(primei)。
接下来考虑合数贡献,我们枚举合数的最小质因子及其次数。
contribution=∑|prime|i=j∑t≥0f(primeti)h(⌊nprimeti⌋,i+1)+f(primet+1i)。
最后要加上一个 f(primet+1i) 是因为不难发现 h(n,j) 不会算到 f(1) 的值,所以质数的次幂会算漏,因此补上。
所以 h(n,j)=g(n,|prime|)−∑j−1i=1f(primei)+contribution。
最后求的就是 h(n,0)+f(1)。
本文作者:OI 生活
本文链接:https://www.cnblogs.com/OccasionalDreamer/p/17451852.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步