Processing math: 100%

[总结] min-25筛

不保证能看懂


再不写总结我又会忘掉啊啊啊啊啊啊啊啊啊

这个min25筛主要用来求一个积性函数的前缀和,就像这样ni=1f(i)
不过这个积性函数要满足两个条件:质数p的函数值f(p)有个多项式表达,f(pc)能够快速计算

min25筛求前缀和的过程可以看成把所有数贡献分成质数贡献和合数贡献计算(可能有1的贡献).先考虑质数的贡献

...

好像除了暴力没有更好的办法啊

不过可以发现一个数>n的质因子最多只有一个,也就是任意合数至少会有一个n的质因子,所以可以枚举n的质因数筛掉合数的贡献.

后面记P为质数集合,Pj为从小到大第j个质数.这里设g(n,j)表示n的所有质数以及最小质因数>Pj的数的pk.考虑从g(n,j1)转移到g(n,j),如果Pj>n,那么所有数都是质数了,所以可以直接赋值过来;否则还要减去最小质因子=Pj的数贡献.先把所有这样的数/Pj,除完后i对应到iPj,同时最小质因子也要满足Pj,所以这一部分就是f(Pj)g(nPj,j1).不过这样也减去了一些<Pj的质数的贡献,要加回来,所以综上所述,转移可以这样写

g(n,j)={g(n,j1)Pjng(n,j1)Pjk(g(nPj,j1)g(Pj1,j1))Pj<n

那个g(Pj1,j1)就是j1k=1f(Pk)

可以发现g(n,|P|)就是所有n质数的贡献(记最大的n的质数为Pm,其实只要做到g(n,m)就行了)

后面记g(n,j)pPrimef(p),可以代入之前算的pk计算得到

然后考虑要求的,类似于上面过程,记S(n,j)n所有最小质因子Pj的数的贡献.首先考虑质数的贡献,也就是|P|k=jf(Pk)=g(n,m)g(Pj1,j1)

然后是合数贡献.先枚举那些合数的最小质因子Pk,然后枚举它的出现次数c,那么剩下数的贡献是S(nPkc,k+1),因为是积性函数,所以这一部分的乘上f(Pkc)就是对应的数的贡献.但是这样子没有算到Pkc的贡献,所以额外加上,转移可以这样写

S(n,j)=g(n,m)g(Pj1,j1)+kjcf(Pkc)(S(nPkc,k+1)+[c>1])

然后递归处理即可

还有就是做的时候,只有形如ni这样的数才是有用的,所以可以给每个这样的数编号,就能用数组代替map

例题先咕了

posted @   ✡smy✡  阅读(135)  评论(1编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示