• 关于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)。

  • 相关阅读:
    C#利用反射动态调用类及方法
    系统程序监控软件
    SQL server 2008 安装和远程访问的问题
    sql server 创建临时表
    IIS 时间问题
    windows 2008 安装 sql server 2008
    sql server xml nodes 的使用
    Window 7sp1 安装vs2010 sp1 打开xaml文件崩溃
    CSS资源网址
    Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0
  • 原文地址:https://www.cnblogs.com/GuessYCB/p/10061411.html
Copyright © 2020-2023  润新知