杜教筛之逆运算

Posted mysblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杜教筛之逆运算相关的知识,希望对你有一定的参考价值。

前言:

下面介绍的这种方法并不常见,但是非常的有用
准确来说,我是来拓荒的,所以有什么问题请一定指出

前置技能:

积性函数
狄利克雷卷积
一定式子转化能力

其实对杜教筛知识点方面要求并不是很高

简单介绍几种常用积性函数:

\\(1.\\text欧拉函数:\\phi(x)=\\text 1—x与x互质的数的个数\\)
\\(2.\\text莫比乌斯函数:\\mu(x)\\text 这个函数定义难以描述,可以自行查找\\)
\\(3.\\text约数个数:d(x)=\\sum_d|x1\\)
\\(4.\\text约数和:\\sigma(x)=\\sum_d|xd\\)
\\(5.\\text恒等函数:I(x)=1\\)
\\(6.\\text单元函数:id(x)=x\\)
\\(7.\\text元函数:\\epsilon(x)=[x=1]\\)

狄利克雷卷积(*)

对于两个数论函数 \\(f(x),g(x)\\)
它们的卷积形式为: \\(f*g(x)=\\sum_d|xf(d)\\times g(\\fracxd)\\)

卷积满足
交换律: \\(f*g(x)=g*f(x)\\)
结合律: \\((f*g)*h(x)=f*(g*h)(x)\\)
分配律: \\((f+g)*h(x)=f*h(x)+g*h(x)\\)

且 积性函数*积性函数 为 积性函数

牢记下面公式:

\\(d(x)=I*I(x)\\)
\\(\\sigma(x)=I*id(x)\\)
\\(id(x)=I*\\phi(x)\\)
\\(\\epsilon(x)=I*\\mu(x)\\)
\\(f*\\epsilon(x)=f(x)\\)

进入正题:

首先介绍杜教筛的式子:

杜教筛之所以是杜教筛,因为存在这样的式子:

\\[\\sum_i=1^nf*g(i)=\\sum_i=1^nf(i)\\sum_j=1^\\lfloor\\fracni\\rfloorg(j)\\]

证明:

\\[\\sum_i=1^nf*g(i)=\\sum_i=1^n\\sum_d|if(\\frac id)g(d)\\]
\\[=\\sum_i=1^n\\sum_d=1f(d)g(\\frac id)[d|i]\\]
\\[=\\sum_d=1^nf(d)\\sum_i=1^\\lfloor\\frac nd\\rfloorg(i)\\]

引入:

考虑这样一道题:

\\[\\sum_i=1^ni\\sum_j=1^\\lfloor\\fracni\\rfloor\\mu(j)\\]

常见做法:
预处理\\(\\mu(x)\\)前缀和,然后整除分块,时间复杂度\\(O(T\\sqrt n+n)\\)

但是若\\(T\\le10^7,n\\le10^7\\),妥妥的TLE
观察杜教筛的式子,发现

\\[\\sum_i=1^ni\\sum_j=1^\\lfloor\\fracni\\rfloor\\mu(j)=\\sum_i=1^nid*\\mu(i)=\\sum_i=1^n\\phi(i)\\]

也就是说此式子与\\(\\phi(x)\\)前缀和等价
那么我们只用预处理\\(\\phi(x)\\)前缀和,\\(O(1)\\)回答询问即可,时间复杂度\\(O(T+n)\\)

这就是杜教筛逆运算最基础的应用

进阶应用1:

考虑这样一道题:

\\[\\sum_i=1^n\\lfloor\\frac ni\\rfloor\\mu*\\phi(i)\\]

常见做法:
积性函数筛,筛出\\(\\mu*\\phi(x)\\ O(n\\log\\log n)\\)并求前缀和
对于每次询问,整除分块
时间复杂度\\(O(n\\log\\log n+T\\sqrt n)\\)

同样的若\\(T\\le 10^7,n\\le10^7\\),妥妥的TLE
此时又来观察杜教筛式子,如果我们把\\(g(x)\\)函数特殊化为\\(I(x)=1\\),可以得到

\\[\\sum_i=1^nI*f(i)=\\sum_i=1^n\\lfloor\\fracni\\rfloor f(i)\\]

\\(f(x)\\)替换为\\(\\mu*\\phi(x)\\)不就是我们要求的式子吗,于是化简为

\\[\\sum_i=1^n\\lfloor\\frac ni\\rfloor\\mu*\\phi(i)=\\sum_i=1^nI*\\mu*\\phi(i)=\\sum_i=1^n\\phi(i)\\]

那么接下来就与前一道相同了,时间复杂度\\(O(T+n)\\)

进阶应用2:

考虑这样一道题:

\\[\\sum_i=1^n\\lfloor\\frac ni\\rfloor^2\\mu(i)\\]

好像很熟悉的亚子。。。
常见做法:
处理\\(\\mu(x)\\)前缀和,整除分块,时间复杂度\\(O(n+T\\sqrt n)\\)

然后被\\(T\\le 10^7,n\\le10^7\\)毒瘤数据卡死

然而继续观察杜教筛式子,把\\(g(x)\\)函数特殊化为\\(id(x)=x\\),可以得到

\\[\\sum_i=1^nid*f(i)=\\sum_i=1^nf(i)\\sum_j=1^\\lfloor\\fracni\\rfloorid(j)\\]
\\[=\\sum_i=1^nf(i)\\frac\\lfloor\\fracni\\rfloor\\times(\\lfloor\\fracni\\rfloor+1)2\\]
\\[=\\frac\\sum_i=1^n\\lfloor\\fracni\\rfloor^2 f(i)+\\sum_i=1^nI*f(i)2\\]

移项得

\\[\\sum_i=1^n\\lfloor\\fracni\\rfloor^2 f(i)=2\\times\\sum_i=1^nid*f(i)-\\sum_i=1^nI*f(i)\\]

\\(f(x)\\)替换为\\(\\mu(x)\\),得

\\[\\sum_i=1^n\\lfloor\\fracni\\rfloor^2 \\mu(i)=2\\times\\sum_i=1^n\\phi(i)-1\\]

那么接下来就与前两道相同了,时间复杂度\\(O(T+n)\\)

当然你要这么做我也没办法:

\\[\\sum_i=1^n\\lfloor\\frac ni\\rfloor^2\\mu(i)=\\sum_i=1^n\\sum_j=1^n[gcd(i,j)=1]=2\\times\\sum_i=1^n\\phi(i)-1\\]

总结:

总而言之,三个式子比较重要

\\[1.\\sum_i=1^nf*g(i)=\\sum_i=1^nf(i)\\sum_j=1^\\lfloor\\fracni\\rfloorg(j)\\]

\\[2.\\sum_i=1^nI*f(i)=\\sum_i=1^n\\lfloor\\fracni\\rfloor f(i)\\]

\\[3.\\sum_i=1^n\\lfloor\\fracni\\rfloor^2 f(i)=2\\times\\sum_i=1^nid*f(i)-\\sum_i=1^nI*f(i)\\]

后记:

可以看看这篇题解,应该会对此方法有更好理解

因为网络上暂时还没找到过这种方法,所以以上全是博主yy出来的
有木有用请由自己掂量,有错误请一定指出
关于这种方法有新的拓展也请一定提出

以上是关于杜教筛之逆运算的主要内容,如果未能解决你的问题,请参考以下文章

杜教筛学习笔记

hdu5608杜教筛

杜教筛

杜教筛

浅谈杜教筛

数论狄利克雷卷积及其快速计算方法及杜教筛