大概的思路是把所有数分成质数和合数考虑
对于质数,必须找出一个很简单的完全积性函数和所求函数拟合
把所有数当做质数看待求个前缀和,然后再枚举合数的最小质因子把合数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个质数的总贡献
这样做就是为了实现将某一范围的数返回和其他因子幂相乘,利用商有限的结论需要预处理的东西也不多