大概的思路是把所有数分成质数和合数考虑
对于质数,必须找出一个很简单的完全积性函数和所求函数拟合
把所有数当做质数看待求个前缀和,然后再枚举合数的最小质因子把合数T掉
枚举到根号n,即可保证把n以内的合数都去掉了,质数已经求出来了
具体把状态设计为G(n,k)表示小于等于n的数中最小质因子大于第k个质数或本身为质数的贡献
枚举k可以只开一维数组,像一维背包一样
然后依次从G[n]中减去最小质因子等于第k个质数的即可,因为小于k的都在之前减过了
等于k的如何获得,就是小于等于n/k的数中最小质因子大于k-1的贡献
直接利用G[n/k],并且把"本身为质数"&&"本身小于k"这部分减掉就行
对于合数,由于其最小质因子一定不大于根号n,所以枚举最小质因子不需要筛出很多的素数
利用积性函数的性质枚举最小质因子的次幂把合数一一加进来即可
考虑如果这个合数没有大于根号n的因子,那么会在递归过程中把其所有质因子的次幂一一累乘
如果有一个大于根号n的因子,那么最后一层递归会返回其最大质因子作为质数的贡献
具体把状态设计为S(n,k),表示小于等于n的数中最小质因子大于等于第k个质数的总贡献
这样做就是为了实现将某一范围的数返回和其他因子幂相乘,利用商有限的结论需要预处理的东西也不多
质数部分直接算(因为完全积性),合数部分枚举最小质因子及其次数算,记得加上质数和所枚举的p^e的贡献
复杂度$O(sumlimits_{x=1}^{sqrt{n}} frac{sqrt{x}}{logsqrt{x}}+sumlimits_{x=1}^{sqrt{n}}frac{sqrt{n/x}}{logsqrt{n/x}})=O(frac{n^{1/2} sqrt{n}^{1/2}}{log n})=O(frac{n^{frac{3}{4}}}{logn})$
powerfulnumber筛
用于筛积性函数$F(x)$前缀和。
设计积性函数$G(x)$满足$G(p)=F(p) && F=G*H$
$F(p)=G(p)*H(1)+G(1)*H(p)$,得$H(p)=0$
由于$F,G$积性,$H$也为积性函数,所以只有$H$的质因子的次数都$ge 2$时才可能有点值
称这类数为$pwerfulnumber=a^2b^3$,$n$以内的数目为$sumlimits_{i=1}^{sqrt{n}}(frac{n}{i^2})^{frac{1}{3}}$
积分可得为$O(sqrt{n})$ $$sumlimits_{i=1}^n F(i)=sumlimits_{i*j<=n} G(i)*H(j)$$ $$=sumlimits_{iin powerfulnum} H(i) sumlimits_{j=1}^{n/i} G(j)$$
然后用F(p^k)的狄立刻雷卷积归纳出H的表达式,一般可以爆搜出根号n个powerfulnum然后用杜教筛求后面的部分。