若是想看如何筛个普通积性函数啥的,就别往下看了,下面没有的(QwQ)。
下文中,全部的\(p\)都表明质数,\(P\)表明质数集合。
注意下文中定义的最小/最大质因子都是默认全部质因子本质不一样。
即\(2*2*3*4*5*5\)的最小/次小质因子都是\(2\),最大/次大质因子都是\(5\)。函数
min_25筛用于求积性函数前缀和,即\(\sum_{i=1}^n f(i)\) 。
min_25筛相比于传统筛法来讲(如莫比乌斯反演、杜教筛),更加灵活,也没有什么定式套路。
不少时候其实能够直接当作一个dp的模型。
这个模型能够解决不少关于质因子贡献的问题。
它的适用条件:spa
第一个条件还蛮严苛的。
min_25筛的思想感受仍是很是有用:筛出质数的\(f\) =====> 筛出全部数的\(f\)。
其中筛质数时,用总答案减去不合法 ; 筛全部数的时候,直接正向计算全部的答案。排序
min_25筛分两步走,首先对于全部\(N = \lfloor \frac{n}{x} \rfloor\) 筛出\(\sum_{i=1}^N [i\in P] f(i)\) 。
把小于等于根号\(n\)的质数筛出来构成\(P\)集合。
又由于\(f(p)\)能够表示为简单多项式,因此:
\[\sum_{i=1}^N [i\in P] f(i) = \sum_{i=1}^N [i\in P] \sum_{k=0}^{\inf} coef_k i^k = \sum_{k=0}^{\inf} coef_k \sum_{i=1}^N [i\in P] i^k\]
因此咱们要求的东西实际上是\(\sum_{i=1}^n [i\in P] i^k\) 。
这个东西怎么求网上博客都写的很清楚了,设\(g(n,j) = \sum_{i=1}^n [i\in P \ or\ p_{min}(i) > p_j] f(i)\)。
而后按照\(j\)分层处理,获得:
\[g(n,j) = g(n,j-1) - p_j^k (g(\lfloor\frac{n}{p_j}\rfloor , j-1) - g(p_{j-1},j-1))\]
其中\(p_j^2 \leq n\) 。
显然,由于咱们把全部数的\(f\)都当成质数的方法来算,因此只有\(g(n,P)\)是真的,其余\(g\)都是假的。
不过没有关系,反正后面的筛法中也只须要用到\(g(n,P)\)。
可是咱们也能够利用这些假的\(g\)来搞事情。
这个过程若是深刻来看是什么呢?就是那个丑的不行的O(ln)埃式筛。
第\(j\)次操做后,剩余集合的\(f\)之和就是\(g(n,j)\)。
这个过程是怎么实现的呢?观察上式右半部分,
咱们每次计算了最小质因子等于当前枚举因子\(p_j\)的函数值之和,而后把它去掉。
这能够看做 用最小质因子\(p_j\)标记了这些合数,注意是合数!
因此若是须要求一些关于最小质因子的东西的合数前缀和时,咱们就能够在这里作手脚了。博客
光说不作假把式,求\(\sum_{i=1}^n [i\not\in P]r(p_{min}(i))i\),其中\(r(x)\)为一个关于\(x\)的函数。
咋作?
咱们直接筛\(\sum_{i=1}^n [i\in P]i\)这个东西,但光筛这个是不行的,由于还要加上\(r(p_{min}(i))\)的贡献。
注意到咱们每次删去合数的答案时,咱们是用最小质因子\(p_{min}(i)\)标记的。
因此每一层\(j\)中,
\(h(j) = p_j (g(\lfloor\frac{n}{p_j}\rfloor , j-1) - g(p_{j-1},j-1))\)不就是以\(p_j\)为最小质因子的合数除掉\(p_j\)后的和吗?
当计算\(g(n,j)\)的时候,在每一层直接加上\(r(p_j)h(j)\)便可。io
若是是求质数前缀和的话......
这个东西本来的做用不就是筛质数的函数值吗?
若是是求全部数前缀和的话......
喂喂喂,把质数的加上合数的不就是全部数了吗?
还有边界问题,\(g(n,0) = \sum_{i=2}^n i^k\),经典问题人人都会,差分或插值弄一下就好了。
这部分的复杂度是\(O(\frac{n^{\frac{3}{4}}}{logn})\),缘由未知。模板
对于后半部分,
设\(S(n,j) = \sum_{i=1}^n [p_{min}(i) \geq p_j] f(i)\),等于把\(i\in P\)的条件删掉。
推导什么的咕咕咕网上都有。class
最后那个尾巴\(f(p_k^{e+1})\)是由于形如\(f(p^k)\)的函数值在计算中被咕咕咕了因此要补上。
这个过程能够发现一个很是有意思的事情。
对于任意一个数\(n\),咱们计算到它步骤是:质因子从小往大枚举因此:原理
因此若是咱们求一些与最大/次大质因子有关的东西的前缀和时,咱们就能够在这上面作手脚了。
先看求最大质因子特殊贡献。
此时须要知足一个条件:质数的后缀贡献好求。
在求解\(S\)的过程当中,咱们能够强制当前这一层可选的\(p_j...p_{|P|}\)为最大质因子,
这样就能够在算质数部分答案的时候,直接把最大质因子\(r(p_{max}(i))\)的贡献直接加上了。
固然前提是这个后缀贡献好加(说句实话不少时侯这个条件都不知足)。
而后咱们就处理了形如\(n = w * p_{max}\)的数的贡献添加。
若这个数\(n = w * p_{max}^k,k>1\),咱们在质数答案部分是没法添加贡献的。
然而若是明白了min_25筛原理就能够发现,其实只须要在那个尾巴\(f(p_{k}^{e+1})\)处加上贡献就好了。
而后若是是处理次大质因子特殊贡献的话,其实还更好求了。
根据上述,咱们知道在\(S(n,j)\)这个状态时,咱们上一层选择的质因子必定是\(p_{j-1}\)。
因此相似的强制当前层选择的\(p\)为最大质因子,而后使用\(p_{j-1}\)在当前层作特殊贡献。
固然注意要特判这个数形如\(w*p_{max}^k,k>1\)的状况,此时在那个尾巴出处理一下便可。
还能干其它的吗?
能够。
注意到对于一个数,咱们在每一层枚举的是一个本质不一样的质因子。
因此咱们还能够处理与特定质因子有关的前缀和计算。
固然注意时刻要记得质数的部分特殊处理,因此筛\(g\)的时候也要特殊处理一下特定质因子。
即那些特殊质因子在\(g\)中的贡献也得是它们特殊形式的贡献。
处理\(g\)中的特殊质因子能够按照如下步骤:gc
光说不练假把式。方法
例:求\(\sum_{i=1}^n [gcd(i,K)=1]\mu(i)\) , 其中\(n\leq 10^{10}\) 。
说实话若是不是学了min_25筛,我这辈子都不会以为这玩意能求。
知道了上面的套路后,这个东西就变得很简单了,
原式即\(\sum_{i=1}^n \mu(i)\)减去包含某些特定质因子的数的贡献,直接在min_25筛的后半部分判一下就好了。
简单吧......
这部分的复杂度是\(O(\frac{n}{poly(logn)})\),缘由一样未知。
min_25筛除了能够筛积性函数前缀和外,还有许多其余应用。
min_25筛在处理与数的因子有关的前缀和计算时,有奇效,很是的好用。
常见模型都包含在上文中了:
这玩意儿这么灵活感受能够放肆出题啊.......早晚要完......瑟瑟发抖...... 就酱(QwQ)。