zoukankan      html  css  js  c++  java
  • 杜教筛

    也许更好的阅读体验

    作用与使用前提

    对一个积性函数(f),我们要求(f)的前(n)项和(S_n),并且要求在比线性复杂度更低的复杂度情况下求出
    若有数论函数(g,h),满足
    (h=f*g)
    其中(*)为狄利克雷卷积
    并且(h)的前缀非常好求,(g)的单项非常好求,我们就可以快速的求出(f)的前缀和


    求法

    先看(f,g,h)的关系
    (egin{aligned}h(n)=sum_{d|n}f(frac{n}{d})g(d)end{aligned})
    我们对(h)求前缀和,则有
    (egin{aligned}sum ^{n}_{i=1}hleft( i ight) &=sum ^{n}_{i=1}fast gleft( i ight)\ &=sum ^{n}_{i=1}sum _{dli}fleft( dfrac {n}{a} ight) gleft( d ight) \ &=sum ^{n}_{d=1}gleft( d ight) sum ^{frac {n}{d}}_{i=1}fleft( i ight) \ &=sum ^{n}_{d=1}gleft( d ight) S_{frac {n}{d}}\ \ end{aligned})
    接下来我们把(d=1)的情况单独提出来

    (egin{aligned}sum ^{n}_{i=1}hleft( i ight) &=g(1)S_n+sum ^{n}_{d=2}gleft( d ight) S_{frac {n}{d}}end{aligned})

    再把(S_n)写到左边
    (egin{aligned}S_{n}=dfrac {left( sum ^{n}_{i=1}hleft( i ight) ight) -left( sum ^{n}_{i=2}gleft( i ight) S _frac {n}{i} ight) }{gleft( 1 ight) }end{aligned})
    对一般的数论函数(g),通常(g(1)=1),于是我们可以把(g(1))省掉,得到
    (egin{aligned}S_{n}=left( sum ^{n}_{i=1}hleft( i ight) ight) -left( sum ^{n}_{i=2}gleft( i ight) S_ frac {n}{i} ight) end{aligned})

    于是我们可以先预处理出来(S_1,S_2,cdots S_m)(m)取一个较大的数,如(10^6)
    之后我们可以通过记忆化搜索的方法来求解(S_n)


    举例

    (mu)

    我们要求(mu)的前缀和,即(f=mu)
    我们知道(I=xi*mu)
    其中(xi(n)=1,I(n)=[n=1])
    那么
    (egin{aligned}S_{mu(n)}&=left( sum ^{n}_{i=1}Ileft( i ight) ight) -left( sum ^{n}_{i=2}xileft( i ight) S _{mu(frac {n}{i})} ight) \ &=1 - sum ^{n}_{i=2} S _{mu(frac {n}{i})}\ end{aligned})

    (varphi)

    或者要求(varphi)的前缀和,即(f=varphi)
    我们知道(varphi)的一条性质
    (egin{aligned}n=sum _{d|n}varphi left( d ight)end{aligned})
    然后我们知道一个数论函数(id)并且(id(n)=n)
    于是这条性质我们也可以写成
    (id=varphi*xi)
    我们再套上面的公式,即可得到
    (egin{aligned}S_{varphi(n)}&=left( sum ^{n}_{i=1}idleft( i ight) ight) -left( sum ^{n}_{i=2}xileft( i ight) S _{varphi(frac {n}{i})} ight) \ &=dfrac{nleft(1+n ight)}{2} - sum ^{n}_{i=2} S _{varphi(frac {n}{i})} end{aligned})

    如有哪里讲得不是很明白或是有错误,欢迎指正
    如您喜欢的话不妨点个赞收藏一下吧

  • 相关阅读:
    android 发短信
    如何判断一个Div是否可视区域,判断div是否可见
    java arrayCopy
    Java 正则表达式 向前、向后匹配
    postgres 正则表达式
    java 分析方法调用过程
    chrome 模拟点击
    Java获取NTP网络时间
    Android对话框与Activity共存时的异常
    Android代码混淆
  • 原文地址:https://www.cnblogs.com/Morning-Glory/p/11335617.html
Copyright © 2011-2022 走看看