[总结] min-25筛
不保证能看懂
再不写总结我又会忘掉啊啊啊啊啊啊啊啊啊
这个min−25筛主要用来求一个积性函数的前缀和,就像这样n∑i=1f(i)
不过这个积性函数要满足两个条件:质数p的函数值f(p)有个多项式表达,f(pc)能够快速计算
min−25筛求前缀和的过程可以看成把所有数贡献分成质数贡献和合数贡献计算(可能有1的贡献).先考虑质数的贡献
...
好像除了暴力没有更好的办法啊
不过可以发现一个数>√n的质因子最多只有一个,也就是任意合数至少会有一个≤√n的质因子,所以可以枚举≤√n的质因数筛掉合数的贡献.
后面记P为质数集合,Pj为从小到大第j个质数.这里设g(n,j)表示≤n的所有质数以及最小质因数>Pj的数的∑pk.考虑从g(n,j−1)转移到g(n,j),如果Pj>√n,那么所有数都是质数了,所以可以直接赋值过来;否则还要减去最小质因子=Pj的数贡献.先把所有这样的数/Pj,除完后i对应到iPj,同时最小质因子也要满足≥Pj,所以这一部分就是f(Pj)g(⌊nPj⌋,j−1).不过这样也减去了一些<Pj的质数的贡献,要加回来,所以综上所述,转移可以这样写
g(n,j)={g(n,j−1)Pj≥√ng(n,j−1)−Pjk(g(⌊nPj⌋,j−1)−g(Pj−1,j−1))Pj<√n
那个g(Pj−1,j−1)就是∑j−1k=1f(Pk)
可以发现g(n,|P|)就是所有≤n质数的贡献(记最大的≤√n的质数为Pm,其实只要做到g(n,m)就行了)
后面记g(n,j)为∑p∈Primef(p),可以代入之前算的∑pk计算得到
然后考虑要求的,类似于上面过程,记S(n,j)为≤n所有最小质因子≥Pj的数的贡献.首先考虑质数的贡献,也就是|P|∑k=jf(Pk)=g(n,m)−g(Pj−1,j−1)
然后是合数贡献.先枚举那些合数的最小质因子Pk,然后枚举它的出现次数c,那么剩下数的贡献是S(⌊nPkc⌋,k+1),因为是积性函数,所以这一部分的乘上f(Pkc)就是对应的数的贡献.但是这样子没有算到Pkc的贡献,所以额外加上,转移可以这样写
S(n,j)=g(n,m)−g(Pj−1,j−1)+∑k≥j∑cf(Pkc)(S(⌊nPkc⌋,k+1)+[c>1])
然后递归处理即可
还有就是做的时候,只有形如⌊ni⌋这样的数才是有用的,所以可以给每个这样的数编号,就能用数组代替map
例题先咕了
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步