• min-25筛总结


    怕忘了赶快更一下。就是求积性函数前缀和的。
    没有 (LaTeX)

    原理

    现在你有一个积性函数
    f(1)=1
    FP(p)
    FPK(p,k)
    首先要求的是前缀和,那就是f(质数)+f(合数)+f(1),然后f(1)=1直接最后加上,算前面的时候直接忽略掉。
    首先算质数(min25筛第一阶段)
    为了能做必须先把f(x)搞成一堆完全积性函数的和一起筛,下面以其中一个f(x)为例
    设G(n,j)为2-n中i(i是质数或者i的最小质因子>pj)的f(i)之和,f是积性函数中的FP函数
    按j从小到大分层筛
    相当于是埃氏筛用最小质因数pj筛
    若pj>sqrt,G(n,j)=G(n,j-1)
    若pj<=sqrt,则需要筛去最小质因子为pj的合数,于是把这个最小质因子拿出来,根据完全积性函数可得
    G(n,j)=G(n,j-1)-pj*(G(n/pj,j-1)-sum_{i=1}^{j-1} f(pi)
    这里减掉的是多余的质数的部分
    然后注意一下初始状态
    G(n,0)=sum{i=2}^n f(i),把2-n所有数全按质数往FP函数里边代。
    因为有好多不是质数的数全部按FP来算了,所以这个第一阶段在没有筛完sqrt以内所有质数的情况是,G(n,j)的值都是假的,没有什么意义的。
    但是全部筛完之后,我们却能对于所有i<=n得到n/i以内质数的函数和,并且这些值全是正确的。那么我们忽略掉第二维记作G(n/i)(i=1...n),这是我们第一个阶段的总任务,也是核心所在!
    递归计算答案(min25筛第二阶段)
    接下来再把质数合数合起来算答案。
    设S(n,j)表示2-n中的所有i(i的最小质因子>=pj)的f(i)之和,f就是原积性函数(注意与第一阶段所设状态的3处不同点)
    然后我们把要算的数分三类
    (1)质数
    前缀和作个差:
    S(n,j)+=G(n)-sum{i=1}^(j-1) f(pi)
    G(n)已经筛出来了,而且值还是对的,那直接哪来用哇
    (2)非纯合数
    直接暴力!
    枚举下最小质因子是谁:pk (k>=j)
    枚举下最小质因子的指标:e (pk(e+1)<=n)(注意这里是pk(e+1),因为如果pk^e>n/e,那n就一定找不到别的>pk的质因子了)
    那么S(n,j)+=S(n/pk^e,j+1)×FPK(pk,e)
    这里把积性函数乘在外面,递归处理,也好理解。
    (3)纯合数
    更简单了
    枚举下最小质因子是谁:pk (k>=j)
    枚举下最小质因子的指数:e (2<=pk^e<=n)(注意从2开始,全是细节)
    S(n,j)+=FPK(pk,e)
    好理解。
    欸这不就直接递归就做完了嘛,,,,
    边界:
    当n==1或者pj>n,S(n,j)=0。
    那么直接调用S(n,1),就能求得2-n中所有数字的f(i)之和,皆大欢喜。
    别忘了还有个f(1)=1要加上。

    实现

    (1)表示状态
    min25筛两个阶段都是类似DP的过程,需要记下标,N太大没发记。
    由于发现过程中只涉及对N的除法,根据整除分块原理,一共只有O(sqrt)个点有值,拎出来即可。
    (2)需要预处理的信息
    sqrt以内的质数;
    两个阶段都要求对sqrt以内的质数计算所给函数的前缀和,也要预处理出来。
    G(n)的初值(把2-n全当做质数往FP里边代的结果,前文有提到)

    复杂度与效率

    复杂度玄学,不清楚是多少,网上说法不一,而且还不清楚第二阶段要不要记忆化。
    大致情况是1s能跑1次10^11, 2次10^10, 若干次10^9。

    使用条件

    (1)求积性函数前缀和
    必须要FP是关于P的多项式,FPK容易用p,k算出
    比如loj的模板就是FP=p-1,FPK=p xor k
    (2)求关于最小质因子(最大真因数)、次大质因子的一些信息
    前者在min25筛第一阶段筛G的过程中可以统计,因为每次是枚举最小质因子
    后者在min25筛第二阶段筛S的(2)(3)部分可以统计,做法是钦定当前枚举的最小质因子是次大的然后算贡献。

    一种递推实现的 min25 筛

    这种方法可以求目标函数在根号 (dfrac{n}{i}) 个位置的前缀和,一般可以结合除法分块使用。
    (F(n,j)) 表示 2~n 中,(minp(x)ge P_j) 或 x 是质数的函数和。
    倒着递推:
    若pj>sqrt,F(n,j)=F(n,j+1)
    若pj<=sqrt,则需要加入最小质因子为pj的合数,枚举最小质因子重数,根据积性函数可得
    F(n,j)+=(F(n/(pj^k),j+1)-sumpri(j)) * f(pj^k) (1<=k, pj^(k+1)<=n)
    枚举形如 pj^k 的数
    F(n,j)+=f(pj^k) (2<=k, pj^k<=n)
    这么做大概就能算根号个位置的前缀和了,虽然看上去复杂度就不对。
    只能跑10^10

  • 相关阅读:
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    Live2D 看板娘
    教你搭建SpringSecurity3框架(附源码)
    浅谈数据库联合查询
  • 原文地址:https://www.cnblogs.com/bestwyj/p/11161142.html
Copyright © 2020-2023  润新知