zoukankan      html  css  js  c++  java
  • 关于min_25筛的一些理解

    关于min_25筛的一些理解

    如果想看如何筛个普通积性函数啥的,就别往下看了,下面没有的(QwQ)。
    下文中,所有的(p)都代表质数,(P)代表质数集合。
    注意下文中定义的最小/最大质因子都是默认所有质因子本质不同。
    (2*2*3*4*5*5)的最小/次小质因子都是(2),最大/次大质因子都是(5)

    step1. 适用条件与思想

    min_25筛用于求积性函数前缀和,即(sum_{i=1}^n f(i))
    min_25筛相比于传统筛法来说(如莫比乌斯反演、杜教筛),更加灵活,也没有什么定式套路。
    很多时候其实可以直接看成一个dp的模型。
    这个模型可以解决很多关于质因子贡献的问题。
    它的适用条件:

    • (f(p))可以表示为简单多项式
    • (f(p^k)) 可以快速求。

    第一个条件还蛮严苛的。
    min_25筛的思想感觉还是非常有用:筛出质数的(f) =====> 筛出所有数的(f)
    其中筛质数时,用总答案减去不合法 ; 筛所有数的时候,直接正向计算所有的答案。

    step2. 筛质数的答案

    min_25筛分两步走,首先对于所有(N = lfloor frac{n}{x} floor) 筛出(sum_{i=1}^N [iin P] f(i))
    把小于等于根号(n)的质数筛出来构成(P)集合。
    又因为(f(p))可以表示为简单多项式,所以:

    [sum_{i=1}^N [iin P] f(i) = sum_{i=1}^N [iin P] sum_{k=0}^{inf} coef_k i^k = sum_{k=0}^{inf} coef_k sum_{i=1}^N [iin P] i^k ]

    所以我们要求的东西其实是(sum_{i=1}^n [iin P] i^k)
    这个东西怎么求网上博客都写的很清楚了,设(g(n,j) = sum_{i=1}^n [iin P or p_{min}(i) > p_j] f(i))
    然后按照(j)分层处理,得到:

    [g(n,j) = g(n,j-1) - p_j^k (g(lfloorfrac{n}{p_j} floor , 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 otin P]r(p_{min}(i))i),其中(r(x))为一个关于(x)的函数。
    咋做?
    我们直接筛(sum_{i=1}^n [iin P]i)这个东西,但光筛这个是不行的,因为还要加上(r(p_{min}(i)))的贡献。
    注意到我们每次删去合数的答案时,我们是用最小质因子(p_{min}(i))标记的。
    所以每一层(j)中,
    (h(j) = p_j (g(lfloorfrac{n}{p_j} floor , j-1) - g(p_{j-1},j-1)))不就是以(p_j)为最小质因子的合数除掉(p_j)后的和吗?
    当计算(g(n,j))的时候,在每一层直接加上(r(p_j)h(j))即可。

    如果是求质数前缀和的话......
    这个东西原本的作用不就是筛质数的函数值吗?
    如果是求所有数前缀和的话......
    喂喂喂,把质数的加上合数的不就是所有数了吗?
    还有边界问题,(g(n,0) = sum_{i=2}^n i^k),经典问题人人都会,差分或插值弄一下就行了。
    这部分的复杂度是(O(frac{n^{frac{3}{4}}}{logn})),原因未知。

    step3. 筛所有数的答案

    对于后半部分,
    (S(n,j) = sum_{i=1}^n [p_{min}(i) geq p_j] f(i)),等于把(iin P)的条件删掉。
    推导什么的咕咕咕网上都有。

    • 质数部分答案:(g(n,P) - sum_{k=1}^{j-1} f(p_k))
    • 合数部分答案:(sum_{k=j}^{|P|} sum_{e=1}^{p_k^{e+1}leq n} [f(p_k^e) S(lfloor frac{n}{p_k^e} floor ,k+1) + f(p_k^{e+1})])

    最后那个尾巴(f(p_k^{e+1}))是因为形如(f(p^k))的函数值在计算中被咕咕咕了所以要补上。
    这个过程可以发现一个非常有意思的事情。
    对于任意一个数(n),我们计算到它步骤是:质因子从小往大枚举所以:

    • (1.p_{j-1})一定是当前数所包含的上一个质因子。
    • 2.它最大的一个质因子一定是最后枚举到的部分。

    所以如果我们求一些与最大/次大质因子有关的东西的前缀和时,我们就可以在这上面做手脚了。
    先看求最大质因子特殊贡献。
    此时需要满足一个条件:质数的后缀贡献好求。
    在求解(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)中的特殊质因子可以按照以下步骤:

    • 把特殊质因子全部拿出来排序,求它们原本形式的(f)、特殊形式的(f')的前缀和。
    • 按照一般方法把(g)给求出来。
    • 对于每个(g),二分得到其包含的特殊质因子范围,用前缀和把原来答案减掉,新答案加上。

    光说不练假把式。

    例:求(sum_{i=1}^n [gcd(i,K)=1]mu(i)) , 其中(nleq 10^{10})

    说实话如果不是学了min_25筛,我这辈子都不会觉得这玩意能求。
    知道了上面的套路后,这个东西就变得很简单了,
    原式即(sum_{i=1}^n mu(i))减去包含某些特定质因子的数的贡献,直接在min_25筛的后半部分判一下就行了。
    简单吧......

    这部分的复杂度是(O(frac{n}{poly(logn)})),原因同样未知。

    总结

    min_25筛除了可以筛积性函数前缀和外,还有许多其他应用。
    min_25筛在处理与数的因子有关的前缀和计算时,有奇效,非常的好用。
    常见模型都包含在上文中了:

    • 筛某积性函数前缀和 (标准形式模板题)
    • 处理"最小质因子特殊贡献"前缀和 (第一部分求(g)变形)
    • 处理"最大值因子/次大质因子特殊贡献"前缀和。 (第二部分求(S)变形)
    • 处理"特定质因子特殊贡献"前缀和。 (第一部分求(g)特殊处理,第二部分求(S)变形)

    这玩意儿这么灵活感觉可以放肆出题啊.......迟早要完......瑟瑟发抖......
    就酱(QwQ)。

  • 相关阅读:
    【AtCoder】ARC067 F
    【AtCoder】ARC095 E
    【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
    【CodeForces】961 F. k-substrings 字符串哈希+二分
    【CodeForces】961 G. Partitions 斯特林数
    【BZOJ】2310: ParkII 插头DP
    【BZOJ】2331: [SCOI2011]地板 插头DP
    webpack从0开始---(二)
    webpack从0开始---(一)
    前端基础知识(不应需要思考的知识点)三
  • 原文地址:https://www.cnblogs.com/GuessYCB/p/10061411.html
Copyright © 2011-2022 走看看