To Do List
1、待学:各种筛法,泰勒展开等生成函数辅助内容
2、待补:多项式板子及证明,BSGS,高斯消元,斯特林数
无先后之分。
排列组合相关
排列组合tricks
1、(C_{n}^{a_1,a_2,...,a_k}=frac{n!}{a_1!a_2!...a_k!})(暴力拆开)
2、(C_n^i=C_{n-1}^i+C_{n-1}^{i-1})(n个里选i个,第i个不选+第i个选的情况)(杨辉三角)
3、(sum_{j=i}^{n}(-1)^{j-i}C_n^j=C_{n-1}^{i-1})(先设(p_i=C_n^i),然后把(p_i)用2中的式子拆成3项,递归地证明)
4、(sum_{i=0}^{n} (-1)^i C_{n}^{i} = [n=0])
5、(sum_{i=0}^{n} C_{n}^{i} = 2^n)
多项式相关
多项式板子
1、多项式求逆
暴力展开,两边同乘(F(x))即可得证。
2、多项式ln
对复合函数求导,即可得证。
3、多项式exp
了解(e^x)的泰勒展开,即可得证。
4、多项式带余除法
暴力展开、凑一凑,即可得证。
其中,对于多项式(A(x)),有(A_R(x)=x^nA(frac{1}{x}))
5、多项式开根
暴力展开,即可得证。
特殊多项式卷积
多项式tricks
1、对于(F(x)=sum f_i x^i),若(f_i=sum a_j b_{i+j}),那么将(b)序列反向成为新序列(b'),就可以变成(f_i=sum a_j b'_{n-i-j}),可以卷积
2、(prod F(x)=exp(ln(prod F(x)))=exp(sumln(F(x))))
3、(frac{1}{1-x}=sum_{i=0}^{infty} x^i)(大除法)
拓展:(frac{1-x^{n+1}}{1-x}=sum_{i=0}^n x^i)
4、(x^{(k+b)}operatorname{mod}(x^k-1)=x^b)(大除法)
对于上面的这条式子(循环卷积),若它在(operatorname{mod p})意义下进行且(operatorname{p mod k}=1),则可以选择类似FFT的方法,设(g)为(p)的原根,则单位根为(gn=g^{(p-1)/k}),带入、直接相乘即可(即,FFT在位数不够的时候就是循环卷积)
5、乘法变加法:取log、取原根
拉格朗日插值
设我们要求一个n次多项式,则容易证明代入n+1个点值((x_i,y_i))即可唯一确定该多项式。
于是有:(f(x)=sum_{i=1}^n y_i prod_{j≠i}frac{x-x_j}{x_i-x_j})
自然数幂求和
1、模数为质数但不为NTT质数,n、k均给定
设(S_k(n)=sum_{i=1}^{n} i^k)。
利用多次差分,每次消掉最高项,可以证明(S_k(n))是一个(k+1)次多项式,于是我们可以代入(k+2)个点值来求解。
为了让代入的东西便于计算,我们代入(1)~(k+2)。
于是根据拉格朗日插值:
对于求(i^k),我们可以利用筛法求质数的时候求出,复杂度可以达到(leq O(k))。
2、模数为NTT质数,n给定,询问k=0~K的答案。
设 (S_k(n)=sumlimits_{i=0}^ni^k)。
那么我们求出一个与 (S_k(n)) 有关的生成函数:
注意到 (e^x) 的泰勒展开为:(e^x=1+dfrac{x}{1!}+dfrac{x^2}{2!}+cdots),故原式为:
注意到 (dfrac{1}{1-x}=1+x+x^2+cdots),有 (1+x+x^2+cdots+x^n=dfrac{1-x^{n+1}}{1-x})。
那么原式即为:
多项式求逆即可。
最后得到的系数记得乘上个 (k!) 才是 (S_k(n))。
时间复杂度 (O(Klog K))。
矩阵相关
矩阵树定理
1、基尔霍夫矩阵
(K=D-A),其中A为邻接矩阵,D为度数矩阵。
2、求解
基尔霍夫矩阵可以用于求带标号生成树个数。
无根树:去掉任意一行一列之后求K的行列式即为答案。
有根树:去掉(root)行(root)列。
内向树:度数矩阵变为出度矩阵。
外向树:度数矩阵变为入度矩阵。
3、tips
边权可以有值,可以统计出所有生成树的边权乘积的和。
这个值甚至可以为一个(x),然后变成一个多项式。
4、例题
XSY3918 数数
常系数线性递推
1、前置知识:Cayley-Hamilton 定理
考虑转移矩阵:
令其特征多项式(f(lambda)=|I cdot lambda - A|),显然是一个k次的多项式(做题的时候可能要手动拆出来)
则(f(A)=0)
2、完整步骤
考虑初始矩阵为
其中(b)即为我们要求的数列。
则显然递推(n)步后的答案是(b_{n}=(GA^{n})_{0,0})
考虑到(f(A)=0),那么设(F(A)=A^n),显然我们可以把(F(A))无限次减去(f(A)),一直到(F(A))变为k次以内,这个操作类似于取模
也就是有(F(A)=F(A)operatorname{mod}f(A))
令(H(A)=F(A)operatorname{mod}f(A)),于是它的形式可以为(H(A)=sum_{i=0}^{k-1} h_i A^i)
于是,
其中(h_i)可以使用多项式快速幂(取模)来求出。这部分是(O(k log k log m))的。
而(b_i)在没有方便的方法求出来的情况下只能(O(k^2)),瓶颈很可能在这里。做题的时候多注意一下。
3、例题
XSY3915 数学作业
容斥相关
多步容斥
众所周知的多步容斥公式:
(|A_1 cup A_2 cup cdots cup A_n| = sum_{i=1}^n |A_i| - sum_{1 leq i,j leq n} |A_i cap A_j| + cdots + (-1)^{n-1} |A_1 cap A_2 cap cdots cap A_n|)
证明:考虑一个元素被m个集合包含时,它对左边的贡献是1。
那么它对右边的贡献为:(sum_{i=1}^{m} (-1)^{i-1} C_{m}^{i} = sum_{i=0}^{m} (-1)^{i-1} C_{m}^{i} + C_{m}^{0} = 1)
于是原式成立。
二项式定理
1、原始形式
众所周知,补集的交集就是并集的补集,于是我们令(A^c)代表(A)的补集,(S)为全集,可以将上面的式子变形:
(|A^c_1 cap A^c_2 cap cdots cap A^c_n| = |S| - sum_{i=1}^n |A_i| + sum_{1 leq i,j leq n} |A_i cap A_j| - cdots + (-1)^{n} |A_1 cap A_2 cap cdots cap A_n|)
同理,我们把补集换为原集,则有:
(|A_1 cap A_2 cap cdots cap A_n| = |S| - sum_{i=1}^n |A^c_i| + sum_{1 leq i,j leq n} |A^c_i cap A^c_j| - cdots + (-1)^{n} |A^c_1 cap A^c_2 cap cdots cap A^c_n|)
考虑令(f(i))为(i)个补集的交集大小,(g(i))为(i)个原集的交集大小,根据上式,则可以得到:
(f(n) = sum_{i=0}^{n} (-1)^{i} C_{n}^{i} g(i) Leftrightarrow g(n) = sum_{i=0}^{n} (-1)^i C_{n}^{i} f(i))
2、变式
常见变换一:
(f(n)=sum_{i=0}^{n} C_{n}^{i} g(i) Leftrightarrow g(n) = sum_{i=0}^{n} (-1)^{n-i} C_{n}^{i} f(i))
把原始的(g(i))换成((-1)^i g(i))即可证明。
常见变换二(重点!):
(f(n)=sum_{i=n}^{m} C_{i}^{n} g(i) Leftrightarrow g(n) = sum_{i=n}^{m} (-1)^{i-n} C_{i}^{n} f(i))
证明:
证毕。
3、例题
loj6358 前夕,其中需要用到单位根反演。
XSY3996 棋盘染色
单位根反演
(forall k,有[n mid k]=frac{1}{n} sum_{i=0}^{n-1} omega_{n}^{ik})
证明:
显然,当(n mid k)时,(ik)为(n)的倍数,右边式子即为(frac{1}{n} imes n = 1)
而(n mid k)时,后面的式子是一个等比数列求和,可以发现分子始终为0。
min-max容斥
1、一般形式:
(max (S)=sum_{T subseteq S} (-1)^{|T|-1} min (T))
(min (S)=sum_{T subseteq S} (-1)^{|T|-1} max (T))
前提是集合中元素不相等(若相等则加入eps扰动即可)
只证第一条式子。
考虑从大到小排序,则第一名就是我们要求的(max(S))。
考虑当一个元素为第(k(k>1))名时,它对右边式子的贡献,可以发现就是当(T)中元素除了它自己以外都比它小的时候有贡献。
容易发现,对于比它小的元素,组成的集合中大小为奇数与大小为偶数的集合个数是相同的,所以可以抵消。
只有第一名的时候,只能为空集,没法抵消。于是左右两边相等。
2、广义min-max容斥
(kthmax (S)=sum_{T subseteq S} (-1)^{|T|-k} C_{|T|-1}^{k-1} min (T))
(kthmin (S)=sum_{T subseteq S} (-1)^{|T|-k} C_{|T|-1}^{k-1} max (T))
同样只证第一条式子。
我们要构造一个系数(f),使得它满足(kthmax (S)=sum_{T subseteq S} f(|T|) min(T))。
我们考虑每个值的贡献,设它从大到小排名为(x),则它的贡献是
([x==k] = sum_{i=0}^{x-1} C_{x-1}^{i} f(i+1)),这个就是钦定比它小的集合的子集,然后代入系数(f)。
令(g(x) = [x==k-1]),(h(x)=f(x+1)),则原式可以表达为:
(g(x-1) = sum_{i=0}^{x-1} C_{x-1}^{i} h(i)),不难发现这是一个二项式反演的形式,于是有:
原式得证。
- 上述的式子可以套到期望里面,如下面的例题。
3、例题
Luogu4707 重返现世
bzoj4036 按位或
其它
牛顿迭代
考虑对于一个递增或递减函数(f(x)),我们要求它的零点。
那我们随便取一个初值(x_0)(与零点越相近越好),然后每次作过((x_0,f(x_0)))的(f(x))的切线。容易得到其切线方程为(y=f'(x_0)(x-x_0)+f(x_0))。
将这个切线方程的零点作为下一个(x_0),不断重复上述过程,然后在精度满足条件的时候就可以得到答案。