zoukankan      html  css  js  c++  java
  • 组合数学,容斥原理与反演

    这一篇是一个专题总结,可能会写很久,希望不会咕掉

    一.组合数学:

    ①.基本公式:

    1.排列数公式$A_{n}^{m}=frac{n!}{(n-m)!}$,表示从$n$个元素中选出$m$个元素并进行全排列的方案数

    特别的,当$m=n$时,有$A_{n}^{n}=n!$(规定$0!=1$)

    2.组合数公式$C_{n}^{m}=frac{n!}{m!(n-m)!}$,表示从$n$个元素中选出$m$个元素的方案数

    排列与组合的关系:$A_{n}^{m}=C_{n}^{m}m!$

    3.组合数常见的等式:

    (1).组合数的递推公式

    $C_{n}^{m}=C_{n-1}^{m-1}+C_{n-1}^{m}$

    基于这一等式,产生了杨辉三角:

    1

    1 1

    1 2 1

    1 3 3 1

    ...

    杨辉三角第$i$行第$j$列表示$C_{i}^{j}$(因此下标必须从$0$开始计数)

    (2).杨辉三角某一行的求和公式:

    $sum_{i=0}^{n}C_{n}^{i}=2^{n}$

    这一公式比较常用

    (3).杨辉三角某一行的平方和公式:

    $sum_{i=0}^{n}(C_{n}^{i})^{2}=C_{2n}^{n}$

    (4).组合数的奇偶求和公式:

    $C_{n}^{0}+C_{n}^{2}+...=C_{n}^{1}+C_{n}^{3}+...=2^{n-1}$

    (5).组合数求和公式:

    $sum_{i=m}^{n}C_{i}^{m}=C_{n+1}^{m+1}$

    代入上述递推式即可证明

    (6).组合数的卷积公式:

    $sum_{i=0}^{k}C_{m}^{i}C_{n}^{k-i}=C_{n+m}^{k}$

    (7).组合数的对称性:

    $C_{n}^{m}=C_{n}^{n-m}$

    从$n$个元素中取出$m$个拿走等价于从$n$个元素中取出$n-m$个留下

    4.卢卡斯定理:

    $C_{n}^{m}equiv C_{n mod p}^{m mod p}C_{n/p}^{m/p}$ $mod$ $p$

    5.拓展卢卡斯定理的诡异结论:

    若$p$为一个奇质数,对任意$kin N^{*}$,有:$prod_{i=1}^{p^{k}} [gcd(i,p)equiv 1]i equiv p^{k}-1$ $mod$ $p^{k}$

    当$p=2$时,对任意$kleq 3$,有:$prod_{i=1}^{p^{k}} [gcd(i,p)equiv 1]i equiv 1$ $mod$ $p^{k}$

    (剩下那俩你算一下就好,$k=2$时右侧是$3$)

    ②.二项式定理:

    1.基本公式:

    $(x+y)^{n}=sum_{i=0}^{n}C_{n}^{i}x^{i}y^{n-i}$

    2.有关推论:

    (1).

    令$y=1$,得:

    $(x+1)^{n}=sum_{i=0}^{n}C_{n}^{i}x^{i}$

    然后对上式左右求导,得到:

    $n(x+1)^{n-1}=sum_{i=1}^{n}iC_{n}^{i}x^{i-1}$

    再令$x=1$,得:

    $n2^{n-1}=sum_{i=1}^{n}iC_{n}^{i}$

    发现右侧从$0$开始无影响,也即:

    $n2^{n-1}=sum_{i=0}^{n}iC_{n}^{i}$

    不过更常见的是左右互化的应用。

    (2).

    令$y=1$,得:

     $(x+1)^{n}=sum_{i=0}^{n}C_{n}^{i}x^{i}$

    然后对上式左右积分,得:

    $int (x+1)^{n}=int sum_{i=0}^{n}C_{n}^{i}x^{i}$

    展开得:

    $frac{1}{n+1}(x+1)^{n+1}+C=sum_{i=0}^{n}frac{1}{i+1}C_{n}^{i}x^{i+1}$

    再令$x=1$,,求出常数项,得:

    $frac{2^{n+1}-1}{n+1}=sum_{i=0}^{n}frac{C_{n}^{i}}{i+1}$

    仍然可以左右互化

    这两个是比较常用的结论

    二.序列的生成函数:

    生成函数在计算方案数以及计算递推公式时都有很大的作用

    ①.基本定义:

    给出序列{$a_{n}$}={$a_{0},a_{1},a_{2}...a_{n}$},构造一个函数(或者多项式)$F(x)=a_{0}+a_{1}x+a_{2}x^{2}+...+a_{n}x^{n}$,则这个函数称作这个序列的生成函数(也叫母函数)

    例:序列{$1,1,1....$}的生成函数是$F(x)=1+x+x^{2}+...$

    可以看到,对于一个无穷数列,其生成函数自然会有无穷项

    但是我们在解决问题时显然不可能讨论一个有无穷项的函数,而且这种函数的运算是极其困难的,因此我们考虑对这种函数进行化简:

    (在化简这里有两种说法,这两种说法都能得出最后的结果,因此对于我这种蒟蒻暂且认为这二者等价,如果有大佬发现问题请及时讲解,谢谢!)

    1.来自大部分资料的观点:

    对于一个函数$F(x)=1+x+x^{2}+...$,可以发现这是一个等比数列求和的形式,由于在生成函数中真正体现数列性质的是每一项前的系数,而自变量本身的取值则意义不大,大部分时候我们不需要也不应该对这个自变量进行赋值,因此我们不妨给定一个定义域$xin (0,1)$,这样基于无穷递缩等比数列求和公式($sum_{i=0}^{∞}q^{i}=frac{1}{1-q}(qin (0,1)$)立刻可以得出该函数的一个变形:$F(x)=1+x+x^{2}+...=frac{1}{1-x}$

    2.来自一个ppt的观点:

     对于一个多项式,给出记法$F(x)$ $mod$ $x^{n}$表示$F(x)$在只保留次数低于$n$的项之后剩余的部分

    那么仍然套用等比数列求和公式(虽然不是递缩的不一定收敛但保证$x!=1$公式还是可以用的嘛)

    可以写出:$F(x)=frac{1-x^{n}}{1-x}$

    当$n->∞$时,对任意的$m$,一定有:$frac{1-x^{n}}{1-x}$ $mod$  $x^{m}=frac{1}{1-x}$

    因此$F(x)=1+x+x^{2}+...=frac{1}{1-x}$

    (这两种观点我个人认为都是在$n->∞$时令$x^{n}=0$基于等比数列求和给出的,因此最后导出的结果一致,至于中间理解...见仁见智吧,我个人更喜欢第一种理解方式)

     无论如何,我们已经做出第一个生成函数了

    可是...这玩意有啥用?

    ②.实际应用——计算方案

    问题:

    设物品$A$共有$n$种价格,每种价格$i$有$a_{i}$个物品

    设物品$B$共有$m$种价格,每种价格$i$有$b_{i}$个物品

    求:已知总花费$w$,在$A$,$B$两种物品中各购买一件物品,问总方案数?

    (sb水题)

    设物品$A$选用的价格为$i$,则与之对应的物品个数即为$a_{i}$,那么物品$B$选用的价格即为$w-i$,与之对应的物品个数为$b_{i}$,因此这一种的贡献即为$a_{i}b_{w-i}$

    因此总贡献即为$sum_{i=0}^{w}a_{i}b_{w-i}$

     (我会FFT,NTT!!!)

    于是目测这个问题已经解决了

    (好像没用上生成函数嘛)

    但是,如果我们换个角度思考,对序列{$a_{n}$},{$b_{m}$}分别构造生成函数$F(x)=sum_{i=0}^{w}a_{i}x^{i}$,$G(x)=sum_{i=0}^{w}b_{i}x^{i}$,那么上面的答案不就是$F(x)$与$G(x)$做卷积后$x^{n}$这一项前面的系数嘛!

    (我不用生成函数也能看出来!)

    如果我们有200个序列有各自的要求呢?

    emmmmm.....

    好像问题有点大...

    但是,如果我们用生成函数,无论有多少个序列,最后也都是把这一坨东西乘起来就行了嘛

    好像问题不大了...

    可是...如果我们给出的数列有无穷项呢?

    总不能跑无穷的FFT吧...

    问题好像又出来了...

    但是,如果仔细想想,怎么会让你做一个又没有递推(通项)又无穷的数列嘛!

    这不是难为人吗

    因此,如果一个数列有递推或者通项,那么生成函数可以借助上面的形式去化简啊

    可是...我们最后要的是生成函数中某一项的系数,都变成这种诡异的分式怎么找最后的答案嘛!

    不要忘了,上面我们做的都是等式,等式左右两侧可以互换的啊!

    因此如果我们最后能求出一个分式的结果,那我们就能反向导出一个多项式!

    因此我们的核心问题就在于怎么快速双向推导

    我们有前辈的经验!

    两个常见的模型:

    $F(x)=1+x^{a}+x^{2a}+...=frac{1}{1-x^{a}}$

    在有限项下的特殊情况:

    $F(x)=1+x^{a}+x^{2a}+...+x^{na}=frac{1-x^{(n+1)a}}{1-x^{a}}$

    (注意!无限项与有限项是有本质区别的,因此有限项不应该套成无限项的公式)

    另一个模型:

    $F(x)=sum_{i=0}^{∞}C_{i+k-1}^{k-1}x^{i}=frac{1}{(1-x)^{k}}$

    (以上内容不加证明直接给出)

    下面给出一道例题:

    luogu 2000

    题解看这里

    ③.实际应用——计算数列的通项:

    当然了,生成函数还有别的用处,比如用来求个通项之类的,最典型的例子就是斐波那契数列通项的计算,通常用的是特征根法,但是生成函数是一个适用范围更广的方法

    1.给出序列$f(n)=af(n-1)$($f(0)=1$),求该序列的通项

    这不是等比数列么

    从这里开始我觉得更好理解一些

    首先直接构造这一序列的生成函数:

    $G(x)=sum_{i=0}^{∞}f(i)x^{i}$

    根据递推式,我们应当左右乘一个$ax$,于是得到:

    $axG(x)=sum_{i=0}^{∞}af(i)x^{i+1}$

    根据递推式,$af(i)=f(i+1)$,得到:

    $axG(x)=sum_{i=0}^{∞}f(i+1)x^{i+1}$

    上下做差,得到:

    $(1-ax)G(x)=f(0)x^{0}=1$

    移项得:

    $G(x)=frac{1}{1-ax}$

    发现就是我们上面提到过的一个等比数列求和的模型(只不过公比变成了$ax$),于是立刻还原成等比数列求和的形式:

    $G(x)=1+ax+(ax)^{2}+...$

    也就是

    $G(x)=1+ax+a^{2}x^{2}+a^{3}x^{3}+...$

    那么$x^{i}$前的系数即为$a^{i}$,也即$f(i)=a^{i}$

    (这玩意用生成函数求怕不是闲的)

    你对生成函数的力量一无所知

    2.给出序列$f(n)=f(n-1)+f(n-2)$($f(0)=0,f(1)=1$),求该序列的通项

    这是斐波那契数列嘛

    我会矩阵乘法!可我问的是通项

    仍然按照套路来,构造一个生成函数$G(x)=sum_{i=0}^{∞}f(i)x^{i}$

    那么基于递推,显然要做两次变形:

    左右乘$x$,得到:

    $xG(x)=sum_{i=0}^{∞}f(i)x^{i+1}$

    左右乘$x^{2}$,得到:

    $x^{2}G(x)=sum_{i=0}^{∞}f(i)x^{i+2}$

    后两个表达式求和,得到:

    $(x+x^{2})G(x)=sum_{i=0}^{∞}f(i)x^{i+1}+sum_{i=0}^{∞}f(i)x^{i+2}$

    也就是:

    $(x+x^{2})G(x)=sum_{i=1}^{∞}[f(i)+f(i-1)]x^{i+1}$

    根据递推公式,可以求得:

    $(x+x^{2})G(x)=sum_{i=1}^{∞}f(i+1)x^{i+1}$

    再用第一个表达式去减:

    $(1-x-x^{2})G(x)=f(1)x^{1}$

    移项可得:

    $G(x)=frac{x}{1-x-x^{2}}$

    问题来了:这玩意怎么变回多项式形式?

    我们只会上面那两种原式形式啊!

    没有关系,我们做一个转化就好。

    我们看看,能不能将上述表达式转化成$G(x)=frac{A}{1-ax}+frac{B}{1-bx}$的形式

    那么首先整理一下分母,把分母写成$(1-ax)(1- bx)$这种形式

    如果我令上式为0,可以求得$x_{1}=frac{1}{a}$,$x_{2}=frac{1}{b}$

    那么求解分母$1-x-x^{2}=0$这个二次方程,解得:

    $x_{1}=frac{-1+sqrt{5}}{2}$,$x_{2}=frac{-1-sqrt{5}}{2}$

    那么对应一下,就得到了:

    $a=frac{sqrt{5}+1}{2}$,$b=frac{-sqrt{5}+1}{2}$

    于是变形得到:

    $frac{A}{1-frac{1+sqrt{5}}{2}x}+frac{B}{1-frac{1-sqrt{5}}{2}x}$

    那么再通分一下,得到:

    $frac{A[1-frac{1-sqrt{5} }{2} x]+B[1-frac{1+sqrt{5} }{2} x]}{1-x-x^{2}}$

    (不要担心这个式子,因为他在一秒钟之内就会消失)

    与原来的生成函数对应一下,发现原来的分子是$x$,因此我们整理之后立刻可以列出一个二元一次方程组,即要求常数项为$0$,一次项系数为$1$的一个方程组

    也就是:

    $A+B=0$

    $-frac{1-sqrt{5}}{2}A-frac{1+sqrt{5}}{2}B=1$

    解之,得:

    $A=frac{1}{sqrt{5}},B=-frac{1}{sqrt{5}}$

    那么也就是:

    $G(x)=frac{1}{sqrt{5}}frac{1}{1-frac{1+sqrt{5}}{2}x}-frac{1}{sqrt{5}}frac{1}{1-frac{1-sqrt{5}}{2}x}$

    那不就相当于两个等比数列乘系数相加了嘛!

    于是通项也就写出来了:$f(n)=frac{1}{sqrt{5}}[(frac{1+sqrt{5}}{2})^{n}-(frac{1-sqrt{5}}{2})^{n}]$

    这个表达式的神奇之处也在于,即使里面充满了$sqrt{5}$,你算出来的结果也一定是一个整数!

    这就是生成函数的力量。

    三.常见的模型结论:

    ①.卡特兰数问题:

    模型1:给出$n$个0和$n$个1,将他们排成一个长度为$2n$的序列,问有多少种排列方式使得在该序列的任意前缀中$0$的个数不少于$1$的个数?

    模型2:给出$n$对括号,问有多少种合法的括号序列(将左括号看做"0",右括号看做“1”,问题和模型1等价)?

    模型3:在一个$n*n$的网格中从左下角向右上角走,只能向上或向右且不能越过对角线的方案数?

    模型4:一个有$n+1$个叶节点的不同二叉树种类数?(或有$n$个节点的二叉树种类数?)

    模型5:在圆上有$2n$个节点,两两连线

    这些问题的答案都是卡特兰数的第$n$项

    卡特兰数列记作$c_{n}$($c_{0}=1$)

    他的通项:$c_{n}=C_{2n}^{n}-C_{2n}^{n-1}$=$frac{1}{n+1}C_{2n}^{n}$

    他的递推:$c_{n+1}=frac{2(2n+1)}{n+2}c_{n}$

    递推的卷积形式:$c_{n+1}=sum_{i=0}^{n}c_{i}c_{n-i}$(注意左右互化,推出右侧这种形式的东西考虑卡特兰数)

    生成函数形式:$F(x)=frac{1-sqrt{1-4x}}{2x}$

    ②.第一类斯特林数:

     第一类斯特林数$S_{1}(n,k)$表示将$n$个数的序列划分为$k$个圆排列的方案数

    递推式:$S_{1}(n,k)=S_{1}(n-1,k-1)+(n-1)S_{1}(n-1,k)$

    递推原理:考虑第$n$个元素的放法:首先是单独形成一个圆排列,或者在放在原先的圆排列中任意一个元素之后

    生成函数形式:第$n$行斯特林数的生成函数为$F(x)=prod_{i=0}^{n-1}(x+i)$

    据说可以分治FFT求,不过既然这样的话应该也可以多项式求逆水一水的说...

    但是好像有个倍增的搞法,推导过程如下:

    考虑我们已知$F_{n}(x)=prod_{i=0}^{n-1}(x+i)$

    那么立刻可以知道$F_{2n}(x)=F_{n}(x)F_{n}(x+n)$

    我们同时还知道$F_{n}(x)=sum_{i=0}^{n}a_{i}x^{i}$

    那么$F_{n}(x+n)=sum_{i=0}^{n}a_{i}(x+n)^{i}$

    二项式定理展开后面那个东西:

    $F_{n}(x+n)=sum_{i=0}^{n}a_{i}sum_{j=0}^{i}C_{i}^{j}x^{i}n^{i-j}$

    改变一下枚举顺序:

    $F_{n}(x+n)=sum_{i=0}^{n}x^{i}sum_{j=i}^{n}a_{j}C_{j}^{i}n^{j-i}$

    打开组合数

    $F_{n}(x+n)=sum_{i=0}^{n}x^{i}sum_{j=i}^{n}a_{j}frac{j!}{i!(j-i)!}n^{j-i}$

    再整理一下后面那一坨

    $F_{n}(x+n)=sum_{i=0}^{n}frac{x^{i}}{i!}sum_{j=i}^{n}a_{j}j!frac{n^{j-i}}{(j-i)!}$

    后面是个卷积,直接算出来,然后乘系数即可

    这样就可以倍增了

    性质:

    $sum_{k=0}^{n}S_{1}(n,k)=n!$

    ③.第二类斯特林数:

    第二类斯特林数$S(n,k)$表示将$n$个不同元素划分为$k$个集合的方案数

    递推式:$S(n,k)=S(n-1,k-1)+kS(n-1,k)$

    组合意义下的写法:$S(n,k)=frac{1}{k!}sum_{i=0}^{k}(-1)^{i}C(k,i)(k-i)^{n}$

    这样的话,考虑快速求斯特林数的方法:

    展开后面的组合数:

    $S(n,k)=frac{1}{k!}sum_{i=0}^{k}(-1)^{i}frac{k!}{i!(k-i)!}(k-i)^{n}$

    然后扔到前面去:

    $S(n,k)=sum_{i=0}^{k}frac{(-1)^{i}}{i!}frac{(k-i)^{n}}{(k-i)!}$

    这就是卷积了嘛

    性质:

    $m^{n}=sum_{i=0}^{m}C_{m}^{i}S(n,i)i!$

    四.容斥原理:

    ①.基础表达式:

    设$|A|$表示集合$|A|$的元素个数,则有:

    $|A_{1}cup A_{2}cup ...cup A_{n}|=sum (-1)^{m-1}|A_{a_{1}}cap A_{a_{2}} cap... cap A_{a_{m}}|$

    这是最基础的表达式,任何一种形式的反演都可以看做容斥原理作用于某一个模型下的结果

    ②.关于“至少”与“恰好”的转化:

    一个都没有=至少有0个-至少有一个+至少有两个...(按奇偶进行容斥)

    五.反演:

    ①.基础反演原理:

    所有反演都是容斥原理的某种体现,是容斥原理作用于某个具体模型下得到的结果,当然大部分也都可以通过直接代入证明

    反演的实质:

    如果我们已知一种递推关系$f_{i}=sum_{j=0}^{i}a_{ij}g_{j}$,那么我们试图构造出用$f$计算$g$的递推式的过程就是反演,即:

    已知$f_{i}=sum_{j=0}^{i}a_{ij}g_{j}$,则可推出$g_{i}=sum_{j=0}^{i}a^{'}_{ij}f_{j}$

    那么我们考虑这个过程的本质:这个过程本质上是提供了一组线性方程

    $egin{pmatrix}a_{00}g_{0}+&0+&0+&...&0=f_{0}\a_{10}g_{0}+&a_{11}g_{1}+&0+&...&0=f_{1}\...\a_{n0}g_{0}+&a_{n1}g_{1}+&a_{n2}g_{2}+&...&a_{nn}g_{n}=f_{n}end{pmatrix}$

    利用高斯消元,我们当然可以在已知$f$的情况下求解出$g$

    当然,由于这个矩阵本身就是个下三角,因此高斯消元其实只需回代,时间复杂度$O(n^{2})$

    但是这个复杂度仍然并不优秀,我们关心的是是否可以快速的求解出用$f$表示$g$之后这个递推式对应的系数

    因此我们需要一些推导

    ②.反演的判别性原理:

    考虑上面的表达式:

    $f_{i}=sum_{j=0}^{i}a_{ij}g_{j}$

    我们想要求出满足$g_{i}=sum_{j=0}^{i}a^{'}_{ij}f_{j}$的$a^{'}$矩阵

    那么我们首先定义一个函数:令$delta(x,y)=[x==y]$,那么显然有表达式:

    $f_{i}=sum_{j=0}^{i}delta(i,j)f_{j}$

    代入上式,得:

    $sum_{j=0}^{i}a_{ij}g_{j}=sum_{j=0}^{i}delta(i,j)f_{j}$

    代入我们想求出的东西,得到:

    $sum_{j=0}^{i}a_{ij}sum_{k=0}^{j}a^{'}_{jk}f_{k}=sum_{j=0}^{i}delta(i,j)f_{j}$

    考虑左侧每个$f_{k}$会被计算的次数,更换一下枚举顺序,得到:

    $sum_{j=0}^{i}f_{j}sum_{k=j}^{i}a_{ik}a^{'}_{kj}=sum_{j=0}^{i}delta(i,j)f_{j}$

    左右系数对应一下,就得到了:

    $sum_{k=j}^{i}a_{ik}a^{'}_{kj}=delta(i,j)$

    所有反演一定满足这一表达式,所有反演的证明也可以基于这一表达式给出

    ③.莫比乌斯反演:

    1.背景知识:狄利克雷卷积

    设$f,g,h$是三个数论函数,定义运算*表示若$f=g*h$,则$f(i)=sum_{d|i}g(d)h(frac{i}{d})$

    2.基础表达式:

    若已知$f(i)=sum_{d|i}g(d)$,则$g(i)=sum_{d|i}mu(d)f(frac{i}{d})$

    3.常见结论:

    $phi(n)=sum_{d|n}mu(d)frac{n}{d}$

    $sum_{d|n}mu(d)=[n==1]$

    $n=sum_{d|n}phi(d)$

    4.常见套路:

    (1).数论分块:

    考虑一个数$n$,对任意$iin [1,n]$,$frac{n}{i}$向下取整的取值数量是$O(sqrt(n))$级别的,这个结论可以推广至两元,即对于两个数$n,m$,对任意$iin[1,n]$,定义二元组$(frac{n}{i},frac{m}{i})$,则这样不同的二元组的个数级别是$O(sqrt(n))$的

    (伪)代码:

    int last=0;
    for(int i=1;i<=n;i=last+1)
    {
        last=min(n/(n/i),m/(m/i));
        ans+=f(last);
    }

    (2).枚举倍数:

    考虑我们已知一种与约数有关的表达式,$f(n)=sum_{d|n}kg_{d}$,$k$为常数,那么我们需要计算出$[1,10^{5}]$的$f$值,如何计算?

    如果直接枚举约数,时间复杂度为$O(nsqrt{n})$,虽然能过但常数巨大,如果这个问题仅仅是一个庞大问题的子问题的话那么这个时间消耗就不合算了

    但是我们考虑另一个问题:$sum_{i=1}^{n}frac{1}{i}=ln n$(调和级数求和)

    那么我们如果直接枚举所有数的倍数的话,时间复杂度就是$sum_{i=1}^{n}frac{n}{i}=nlnn$,这个复杂度就是很优秀的了

    因此我们可以转化问题,将枚举约数转化成枚举倍数!

    (3).调换顺序:

    更换枚举顺序,有时后面的部分就可以预处理或快速计算了

    (4).线性筛:

    线性筛可以筛出大量的信息,积性函数基本都支持线性筛

    在筛非常见积性函数时,我们需要知道这几个问题:

    首先,这个函数是完全积性还是不完全积性?

    这个问题很重要,如果是完全积性函数可以随便算了

    然后,我们能不能由$f(p^{k})$快速计算出$f(p^{k+1})$?

    这一点也很重要,如果我们不能实现这一点的话,就没有办法在不互质的情况下更新答案了

    (5).杜教筛

    杜教筛是这样一种筛法:对于一个数论函数$f$,我们希望快速求出其前缀和

    但是我们的数据范围要求很大,即使线性筛也难以处理

    这时我们就需要考虑杜教筛了

    杜教筛的思想:寻找一个数论函数$g$,令$h=f*g$,且$h$的前缀和可以快速计算(最好是$O(1)$),那么我们导一导式子就可以推出$f$的前缀和了

    首先考虑$f$的前缀和$S_{n}=sum_{i=1}^{n}f(i)$

    然后考虑$f*g$的前缀和$sum_{i=1}^{n}f*g(i)$

    然后整理后面那堆东西:$sum_{i=1}^{n}sum_{d|i}f(d)g(frac{i}{d})$

    按照套路改变枚举顺序,得到:

    $sum_{d=1}^{n}g(d)sum_{j=1}^{frac{n}{d}}f(j)$

    也就是$sum_{d=1}^{n}g(d)S_{frac{n}{d}}$

    接下来考虑我们要求出的是$S_{n}$,也就是在$d=1$时的情况,那么我们考虑$d=1$时,$g(1)S_{n}$的值

    可以发现,这个值就是$sum_{i=1}^{n}g(i)S_{frac{n}{i}}-sum_{i=2}^{n}g(i)S_{frac{n}{i}}$

    于是我们给出杜教筛的表达式:$g(1)S_{n}=sum_{i=1}^{n}g(i)S_{frac{n}{i}}-sum_{i=2}^{n}g(i)S_{frac{n}{i}}$

    这有啥用?

    我们转化一下,也就是$g(1)S_{n}=sum_{i=1}^{n}(f*g)(i)-sum_{i=2}^{n}g(i)S_{frac{n}{i}}$

    那么我们知道,前面那个东西我们让他容易求,后面那堆可以数论分块之后递归求解

    注意记忆化,用map或hash表存一下

    ④.二项式反演:

    1.基本表达式:

    若已知$f(n)=sum_{i=0}^{n}(-1)^{i}C_{n}^{i}g_{i}$,则有:$g(n)=sum_{i=0}^{n}(-1)^{i}C_{n}^{i}f(i)$

    一个更常见的公式:

    已知$f(n)=sum_{i=0}^{n}C_{n}^{i}g(i)$,可以推知$g(n)=sum_{i=0}^{n}(-1)^{n-i}C_{n}^{i}f(i)$

    2.常见应用:将“正好有...”转化为“至少有....”

    这里要用到的一个推论:若$f(k)=sum_{i=k}^{n}C_{i}^{k}g(i)$,则$g(k)=sum_{i=k}^{n}(-1)^{i-k}C_{i}^{k}f(i)$

    ⑤.单位根反演:

    1.基本表达式:

    设$f(x)=sum_{i=0}^{n}a_{i}x^{i}$

    则有$sum_{i=0}^{n}a_{i}[d|i]=frac{1}{d}sum_{p=0}^{d-1}f(w_{d}^{p})$

    在$FFT$中会用到的形式:

    $f_{i}=sum_{j=0}^{n-1}frac{w_{n}^{i*j}}{n}g_{j}$可以推得$g_{i}=sum_{j=0}^{n-1}frac{w_{n}^{-i*j}}{n}f_{j}$

    本质形式:

    $frac{1}{n}sum_{i=0}^{n-1}w_{n}^{d*i}=[n|d]$

    2.常见应用:

    求下标取模某个数为定值的数之和

    ⑥.斯特林反演:

    1.基本表达式:

    若$f(n)=sum_{i=0}^{n}S(n,i)g(i)$,则$g(n)=sum_{i=0}^{n}(-1)^{n-k}S_{1}(n,i)f(i)$

    其中$S(n,i)$表示第二类斯特林数,$S_{1}(n,i)$表示第一类斯特林数

    2.常见应用:

    我不知道...

    六.多项式初步

    ①.多项式求逆:

    问题:

    已知一个次数为$n-1$的多项式$F(x)$,求一个多项式$G(x)$使得$F(x)*G(x)equiv 1$($mod x^{n}$),所有运算在模998244353意义下进行

    怎么搞?

    先进行一点分析:

    如果$F(x)$只有一项,那么$G(x)$里也只有一项,就是$F(x)$里那项的逆元

    那么如果我们已知一个多项式$H(x)$满足$F(x)*H(x)equiv 1$($mod$ $x^{frac{n}{2}}$)

    很显然,根据要求,同时有:$F(x)*G(x)equiv 1$($mod$ $x^{frac{n}{2}}$)

    下式减上式,得到:

    $F(x)(G(x)-H(x))equiv 0$($mod$ $x^{frac{n}{2}}$)

     于是有

    $G(x)-H(x)equiv 0$($mod$ $x^{frac{n}{2}}$)

    两边平方,可以得到:

    $(G(x)-H(x))^{2}equiv 0$ ($mod$ $x^{n}$)

    展开,得:

    $G(x)^{2}+H(x)^{2}-2G(x)H(x)equiv 0$($mod$ $x^{n}$)

    两边乘一个$F(x)$,有:

    $F(x)G(x)^{2}+F(x)H(x)^{2}-2F(x)G(x)H(x)equiv 0$($mod$ $x^{n}$)

    根据要求,$F(x)G(x)equiv 1$($mod$ $x^{n}$)

    于是上式可以化简成:

    $G(x)+F(x)H(x)^{2}-2H(x)equiv 0$($mod$ $x^{n}$)

    移项,得到:

    $G(x)equiv 2H(x)-F(x)H(x)^{2}$ ($mod$ $x^{n}$)

    这样就可以倍增求解了

    ②.多项式带余除法:

    多项式求逆是多项式除法的基础,如果你不会多项式求逆,请看这里

    问题:已知两个多项式$F(x)$(次数为n),$G(x)$(次数为m),求两个多项式$Q(x)$与$R(x)$,满足$F(x)=G(x)Q(x)+R(x)$,所有运算在模998244353意义下进行

    推一发式子:

    $F(x)=G(x)Q(x)+R(x)$

    用$frac{1}{x}$替代$x$,得到:

    $F(frac{1}{x})=G(frac{1}{x})Q(frac{1}{x})+R(frac{1}{x})$

    两边乘一个$x^{n}$,得:

    $x^{n}F(frac{1}{x})=x^{m}G(frac{1}{x})x^{n-m}Q(frac{1}{x})+x^{n}R(frac{1}{x})$

    对表达式$F(x)=G(x)Q(x)+R(x)$进行分析,可以看到,若$F(x)$次数为n,$G(x)$次数为m,则$Q(x)$次数为$n-m$,$R(x)$次数不超过m-1

    那么对自变量先取逆再乘一个最高次数等价于构造一个系数与原多项式恰好相反的多项式!

    也即若$F(x)=sum_{i=0}^{n}a_{i}x^{i}$,则$x^{n}F(frac{1}{x})=sum_{i=0}^{n}a_{n-i}x^{i}$

    我们记$x^{n}F(frac{1}{x})=sum_{i=0}^{n}a_{n-i}x^{i}=F^{T}(x)$

    那么上式可以简写成$F^{T}(x)=G^{T}(x)Q^{T}(x)+R^{T}(x)$

    可以发现,$R^{T}(x)$这个多项式前$(n-m+1)$项的系数均为0!

    因此如果我们在$mod$ $x^{n-m+1}$意义下,可以立刻得出这个等式:

    $F^{T}(x)equiv G^{T}(x)Q^{T}(x)$($mod$ $x^{n-m+1}$)

    那么移项即得:

    $Q^{T}(x)equiv frac{F^{T}(x)}{G^{T}(x)}$($mod$ $x^{n-m+1}$)

    这样就求出了$Q(x)$,然后基于原表达式,可得:

    $R(x)=F(x)-G(x)Q(x)$

    $R(x)$就算出来了

    ③.多项式开根:

    问题:已知一个多项式$F(x)$次数为$n-1$,求一个多项式$G(x)$使得$(G(x))^{2}equiv F(x)$($mod$ $x^{n}$)

    (保证常数项为$1$)

    仍然是推式子

    首先,不难发现的是如果$F(x)$次数为0,那么$G(x)=1$

    类似多项式求逆,我们倍增处理:

    设已知$H(x)^{2}equiv F(x)$($mod$ $x^{frac{n}{2}}$)

    那么有$H(x)^{2}-F(x)equiv 0$($mod$ $x^{frac{n}{2}}$)

    两边平方,得:

    $[H(x)^{2}-F(x)]^{2}equiv 0$($mod$ $x^{n}$)

    两边加上$4H(x)^{2}F(x)$,得到:

    $[H(x)^{2}+F(x)]^{2}equiv 4H(x)^{2}F(x)$($mod$ $x^{n}$)

    两边除掉$4H(x)^{2}$,得:

    $frac{[H(x)^{2}-F(x)]^{2}}{4H(x)^{2}}equiv F(x)$($mod$ $x^{n}$)

    可以发现左边是一个完全平方的形式,那么我们整理一下,得到:

    $[frac{H(x)^{2}-F(x)}{2H(x)}]^{2}equiv F(x)$($mod$ $x^{n}$)

    那么我们所求的$G(x)$不就出来了嘛

    $G(x)=frac{H(x)^{2}-F(x)}{2H(x)}$

    用类似多项式求逆的方法递归求解即可

    ④.多项式对数:

    问题:已知一个次数为$n-1$的多项式$F(x)$,求一个多项式$G(x)$使得$G(x)equiv ln(F(x))$($mod$ $x^{n}$)

    (保证$F(x)$常数项为1)

    这个比较简单:

    两边求导,得:

    $G^{'}(x)equiv frac{F^{'}(x)}{F(x)}$($mod$ $x^{n}$)

    右侧都已知,直接多项式求逆计算出来即可

    然后两边做不定积分,本来会有一个常数项,但是考虑到$ln(F(0))=ln1=0=C$,因此常数项直接为0即可

    ⑤.多项式exp:

    问题:已知一个多项式$F(x)$次数为$n-1$,求一个多项式$G(x)$满足$G(x)equiv e^{F(x)}$($mod$ $x^{n}$)

    保证$F(x)$常数项为$0$

    好像有点困难...

    首先有一个基础知识:

    我们可以用牛顿迭代求出一个多项式的多项式零点

    也即已知一个多项式$F(x)$,可以利用牛顿迭代求出一个多项式$G(x)$满足$F(G(x))equiv 0$($mod$ $x^{n}$)

    为什么我们要知道这件事情?

    假设我们已知了$G_{0}(x)equiv e^{F(x)}$($mod$ $x^{frac{n}{2}}$

    那么我们需要求出的就是$G_{0}$与$G(x)$的关系

    首先,根据牛顿迭代公式,可得:
    $G(x)=G_{0}(x)-frac{F(G_{0}(x)}{F^{'}(G_{0}(x))}$

    (关于这个公式的来历,我在最下面有一个感性理解的部分)

    但是这个嵌套的东西还是很闹心

    那么我们从另一个方向再进行一些推导:

    已知$G(x)equiv e^{F(x)}$($mod$ $x^{n}$)

    那么两边取对数

    $lnG(x)-F(x)equiv 0$($mod$ $x^{n}$)

    设$H(G(x))equiv lnA(x)-B(x)equiv 0$ ($mod$ $x^{n}$)

    那么求导即得到$H^{'}(G_{0}(x))equiv G_{0}^{-1}(x)$

    那么再回到上面的表达式:

     $G(x)=G_{0}(x)-frac{H(G_{0}(x)}{H^{'}(G_{0}(x))}$

    最后整理一遍,得到:

    $G(x)equiv G_{0}(x)[1-lnG_{0}(x)+F(x)]$($mod$ $x^{n}$)

    这样就可以倍增去求了

    关于牛顿迭代:

    假设我们要求一个函数$f(x)$的零点,那么我们不妨假设这个零点是$x_{0}$,然后将$f(x)$在$x=x_{0}$处求导得$f^{'}(x_{0})$,计算出在这一点的切线

    $y=f^{'}(x_{0})(x-x_{0})+f(x_{0})$

    接下来求出该切线与$x$轴交点横坐标$x_{1}$,那么$x_{1}$的精度就比$x_{0}$的精度好一倍(大概是这个意思吧)

    我们计算出$x_{1}$的表达式,可以发现$x_{1}=x_{0}-frac{f(x_{0})}{f^{'}(x_{0})}$,那么这就是一个递推关系式,将未知数$x$换为多项式$G(x)$即得回上式

    ⑥.多项式快速幂:

    问题:已知一个次数为$n-1$的多项式$F(x)$,求一个多项式$G(x)$满足$G(x)equiv F(x)^{k}$

    这个...你需要多项式exp

    直接推一发式子就可以了:

    $G(x)equiv F(x)^{k}$

    $G(x)equiv e^{lnF(x)^{k}}$

    $G(x)equiv e^{klnF(x)}$

    这样写个多项式ln和多项式exp就可以了

  • 相关阅读:
    面经二
    面经一
    Java集合-HashSet
    Java集合-LinkedList
    Java集合-ArrayList
    @JsonIgnoreProperties注解不起作用的问题解决
    纯JS实现图片验证码功能并兼容IE6-8
    java设计模式之桥接模式
    java设计模式之职责链模式
    WPF笔记:WPF自定义treeview样式及数据绑定
  • 原文地址:https://www.cnblogs.com/zhangleo/p/11065290.html
Copyright © 2011-2022 走看看