杜教筛之逆运算
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出来的
有木有用请由自己掂量,有错误请一定指出
关于这种方法有新的拓展也请一定提出
以上是关于杜教筛之逆运算的主要内容,如果未能解决你的问题,请参考以下文章