「不会」Min25筛

  大概的思路是把所有数分成质数和合数考虑

  对于质数,必须找出一个很简单的完全积性函数和所求函数拟合

    把所有数当做质数看待求个前缀和,然后再枚举合数的最小质因子把合数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个质数的总贡献

    这样做就是为了实现将某一范围的数返回和其他因子幂相乘,利用商有限的结论需要预处理的东西也不多

猜你喜欢

转载自www.cnblogs.com/yxsplayxs/p/12375615.html