zoukankan      html  css  js  c++  java
  • 数学笔记

    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、多项式求逆

    [egin{aligned} G(x) &= 2 imes G_0(x) - F(x) imes G_0(x) imes G_0(x) pmod {x^n} end{aligned} ]

    暴力展开,两边同乘(F(x))即可得证。

    2、多项式ln

    [egin{aligned} G'(x)=frac{F'(x)}{F(x)} end{aligned} ]

    对复合函数求导,即可得证。

    3、多项式exp

    [egin{aligned} G(x)=G_0(x)(1-ln(G_0(x))+F(x)) pmod {x^n} end{aligned} ]

    了解(e^x)的泰勒展开,即可得证。

    4、多项式带余除法

    [egin{aligned} Q_R(x)=frac{F_R(x)}{G_R(x)} end{aligned} ]

    暴力展开、凑一凑,即可得证。

    其中,对于多项式(A(x)),有(A_R(x)=x^nA(frac{1}{x}))

    5、多项式开根

    [egin{aligned} G(x)=frac{F(x)+G_0(x) imes G_0(x)}{2 imes G_0(x)} end{aligned} ]

    暴力展开,即可得证。

    特殊多项式卷积

    FWT

    多项式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)

    于是根据拉格朗日插值:

    [egin{aligned} S_k(n)&=sum_{i=1}^{k+2} i^k prod_{j≠i} frac{n-j}{i-j}\ &=sum_{i=1}^{k+2}(-1)^{k+2-i} i^k frac{prod_{j=1}^{i-1}(n-j) prod_{j=i+1}^{k+2}(n-j)}{(i-1)!(k+2-i)!} end{aligned} ]

    对于求(i^k),我们可以利用筛法求质数的时候求出,复杂度可以达到(leq O(k))

    2、模数为NTT质数,n给定,询问k=0~K的答案。

    (S_k(n)=sumlimits_{i=0}^ni^k)

    那么我们求出一个与 (S_k(n)) 有关的生成函数:

    [egin{aligned} &sum_{k=0}^KS_k(n)frac{1}{k!}x^k\ =&sum_{k=0}^Ksum_{i=0}^n i^kfrac{1}{k!}x^k\ =&sum_{i=0}^nsum_{k=0}^K frac{(ix)^k}{k!} end{aligned} ]

    注意到 (e^x) 的泰勒展开为:(e^x=1+dfrac{x}{1!}+dfrac{x^2}{2!}+cdots),故原式为:

    [=sum_{i=0}^ne^{ix}pmod {x^{K+1}} ]

    注意到 (dfrac{1}{1-x}=1+x+x^2+cdots),有 (1+x+x^2+cdots+x^n=dfrac{1-x^{n+1}}{1-x})

    那么原式即为:

    [egin{aligned} =&sum_{i=0}^n(e^x)^ipmod {x^{K+1}}\ =&frac{1-e^{(n+1)x}}{1-e^x}pmod {x^{K+1}}\ =&frac{e^{(n+1)x}-1}{e^x-1}pmod {x^{K+1}}\ =&cfrac{cfrac{(n+1)x}{1!}+cfrac{(n+1)^2x^2}{2!}+cfrac{(n+1)^3x^3}{3!}+cdots}{cfrac{x}{1!}+cfrac{x^2}{2!}+cfrac{x^3}{3!}+cdots}pmod {x^{K+1}}\ =&cfrac{(n+1)+cfrac{(n+1)^2}{2!}x+cfrac{(n+1)^3}{3!}x^2+cdots}{1+cfrac{1}{2!}x+cfrac{1}{3!}x^2+cdots}pmod {x^{K+1}}\ =&cfrac{(n+1)+cfrac{(n+1)^2}{2!}x+cdots+cfrac{(n+1)^{K+1}}{(K+1)!}x^{K}}{1+cfrac{1}{2!}x+cdots+cfrac{1}{(K+1)!}x^{K}}\ end{aligned} ]

    多项式求逆即可。

    最后得到的系数记得乘上个 (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 定理

    考虑转移矩阵:

    [A= left[ egin{matrix} a_1 & a_2 & cdots & a_k\ 1 & 0 & cdots & 0 \ vdots & ddots & ddots & vdots \ 0 & cdots & 1 & 0 end{matrix} ight] ]

    令其特征多项式(f(lambda)=|I cdot lambda - A|),显然是一个k次的多项式(做题的时候可能要手动拆出来)

    (f(A)=0)

    2、完整步骤

    考虑初始矩阵为

    [G= left[ egin{matrix} b_0\ 0\ vdots\ 0\ end{matrix} ight] ]

    其中(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)

    于是,

    [egin{aligned} ans &= (GA^{n})_{0,0} \ &= (G cdot F(A))_{0,0}\ &= (G cdot H(A))_{0,0}\ &= (G sum_{i=0}^{k-1} h_i A^i)_{0,0}\ &= (sum_{i=0}^{k-1} h_i G cdot A^i)_{0,0}\ &= sum_{i=0}^{k-1} h_i (G cdot A^i)_{0,0}\ &= sum_{i=0}^{k-1} h_i b_i end{aligned} ]

    其中(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))

    证明:

    [egin{aligned} f(n)&=sum_{i=n}^{m} C_{i}^{n} g(i)\ &=sum_{i=n}^{m} C_{i}^{n} sum_{j=i}^{m} (-1)^{j-i} C_{j}^{i} f(j)\ &=sum_{j=n}^{m} f(j) sum_{i=n}^{j} (-1)^{j-i} C_{i}^{n} C_{j}^{i}\ &=sum_{j=n}^{m} f(j) C_{n}^{j} sum_{i=n}^{j} (-1)^{j-i} C_{j-n}^{j-i}\ &=sum_{j=n}^{m} f(j) C_{n}^{j} sum_{t=0}^{j-n} (-1)^{t} C_{j-n}^{t}\ &=sum_{j=n}^{m} f(j) C_{n}^{j} [j-n==0]\ &=f(n) C_{n}^{n}\ &=f(n) end{aligned} ]

    证毕。

    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)),不难发现这是一个二项式反演的形式,于是有:

    [egin{aligned} h(x) &= sum_{i=0}^{x} (-1)^{x-i} C_{x}^{i} g(i)\ &= (-1)^{x-k+1} C_{x}^{k-1}\ herefore f(x) &= (-1)^{x-k} C_{x-1}^{k-1} end{aligned} ]

    原式得证。

    • 上述的式子可以套到期望里面,如下面的例题。

    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),不断重复上述过程,然后在精度满足条件的时候就可以得到答案。

    泰勒展开

  • 相关阅读:
    BZOJ 5297: [Cqoi2018]社交网络 矩阵树定理
    BZOJ 5300: [Cqoi2018]九连环 打表+FFT
    BZOJ 5298: [Cqoi2018]交错序列 二项式定理+矩阵乘法
    BZOJ 5301: [Cqoi2018]异或序列 莫队+桶
    BZOJ 5324: [Jxoi2018]守卫 区间DP
    BZOJ 5322: [Jxoi2018]排序问题 模拟+贪心
    点斜式
    斜截式
    斜率
    求线段的交点
  • 原文地址:https://www.cnblogs.com/youddjxd/p/14545569.html
Copyright © 2011-2022 走看看