• 数学知识点小记


    相似矩阵

    定义:若对于矩阵 ( ext A) 存在矩阵 ( ext B) 和可逆矩阵 (Phi) 满足 ( ext B=Phi^{-1} ext APhi) ,那么我们称 ( ext A) 相似于 ( ext B) ,记做 ( ext Asim ext B)
    相似有如下性质:

    1. 反身性: ( ext Asim ext A)
    2. 对称性: 如果 ( ext Asim ext B) ,那么 ( ext Bsim ext A)
    3. 传递性: 如果 ( ext Asim ext B, ext Bsim ext C) ,那么 ( ext Asim ext C)

    相似矩阵有如下性质:

    1. 两者的秩相等
    2. 两者的行列式值相等
    3. 两者拥有同样的特征值,尽管相应的特征向量一般不同
    4. 两者拥有同样的特征多项式
    5. 两者可逆性相同,若均可逆,那么两者的逆矩阵同样相似

    博主仅对第四点进行证明:

    [egin{aligned} 0=|lambda ext E- ext B|=&|Phi^{-1}lambdaPhi-Phi^{-1} ext APhi|\ =&|Phi^{-1}(lambda ext E- ext A)Phi|\ =&|Phi^{-1}| imes|lambda ext E- ext A| imes|Phi|\ =&0\ Rightarrow&|lambda ext E- ext A|=0 end{aligned} ]


    矩阵对角化

    假设一个矩阵 ( ext A) 与对角矩阵 ( ext B) 相似,那么有

    [egin{aligned} ext A^m=&(Phi^{-1} ext BPhi)^m\ =&Phi^{-1} ext B(Phi ext APhi^{-1})^{m-1}Phi\ =&Phi^{-1} ext B^mPhi end{aligned} ]

    问题转化为求桥接矩阵 (Phi) ,这个就各凭本事了
    还有大概会用到的定理如下:
    (n*n) 矩阵 ( ext A) 能被矩阵对角化当且仅当 ( ext A)(n) 个线性无关的特征向量 (v_1,v_2...v_n) ,且 (Phi_{i,j}=v_{j,i})
    问题转化为快速求特征向量,那么考虑怎么快速求矩阵的特征多项式.


    求矩阵特征多项式

    先来一个不带脑子的做法,直接用 (dft+)高消(+idft) ,时间复杂度 (O(n^4)) ,实现可以用插值或者Bluestein

    然后考虑用相似矩阵来优化运算,先来个 (suncongbo) 队长教育我的做法:
    假设最初的矩阵是 ( ext A) ,我们每次给 ( ext A) ,左乘一个初等行变换矩阵,然后右乘一个初等列变换矩阵。
    考虑最后能消成什么矩阵,发现是上海森堡矩阵,因为假如在消其它行第 (i) 列的时候用第 (i) 行去消的话会在做列变换的时候影响第 (i) 行,这样没有达到预期的效果,于是用第 (i+1) 行去消,最后消出来就是上海森堡矩阵。
    这个玩意儿怎么快速求特征多项式呢?
    简单观察后发现最后一行只有两列有值,那么枚举选的是哪一列,如果选第 (n) 列,就是 (lambda-a_{n,n}) 乘以左上角子矩阵的特征多项式,若选第 (n−1) 列,那么接下来一定是若干个第 (n−i) 行选第 (n−i-1) 列,然后会有一行 (j) 选第 (n) 列,由于 (a_{n−1,n−2},a_{n−2,n−3}...a_{j+1,j},a_{j,n}) 都不含变量 (lambda) 所以直接递推即可,复杂度 (O(n^3))
    code


    关于半/全在线卷积的一个优化

    首先知道通过倍增的思想可以把全在线转化为半在线问题,故下面只考虑半在线卷积的优化。
    考虑分治的时候分成 (b) 段,然后算贡献可以看成一个类似二维卷积的东西,然后复杂度是 (O(n*log^{1+epsilon}n)) 的。
    但一般为了方便实现可以取 (b=log n) ,然后对第二维暴力卷积,估计跑出来也比上面的做法快...


    一个经典问题的奇怪做法

    给出一个 (k) 次多项式 (f(x)) 和一个常数 (q) ,并进行 (m) 次询问,每次给出一个 (n) ,求 (Ans=sumlimits_{i=0}^nf(i)q^i,kle 10^6, nle 10^9, mle 10^5)

    考虑简单情况,多次求 (Ans=sumlimits_{i=0}^ni^tq^i)
    列个生成函数出来搞一下:

    [egin{aligned} Ans=&[x^t]sumlimits_{ige0}frac{x^i}{i!}sumlimits_{j=0}^nj^iq^j\ =&[x^t]sumlimits_{i=0}^nq^isumlimits_{jge0}frac{(xi)^j}{j!}\ =&[x^t]sumlimits_{i=0}^n(qe^x)^i\ =&[x^t]frac{q^{n+1}e^{(n+1)x}-1}{qe^x-1}\ end{aligned} ]

    注意此处在 (q=1) 的时候要同时除以一个 (x) 不然分母不存在逆元
    简单观察一下发现答案是关于 (n+1)(t) 次多项式,于是多点求值即可
    然后考虑原问题,构造一个多项式 (F(x)=sumlimits_{i=0}^kf_{k-i}x^i)
    然后答案就可以表示为 ([x^k]frac{q^{n+1}e^{(n+1)x}-1}{qe^x-1}*F(x))
    同样只需要多点求值一下即可。


    数论函数与生成函数的一些联系

    目前学过的有 (DGF) 和贝尔级数两种东西。
    观察一下发现本质上都是在对这个东西进行变形: (sumlimits_{ige0}f(i)=prodlimits_{pin Prime}(1+sumlimits_{ige1}f(p^i)))
    假如这是个完全积性函数,也可以写成: (sumlimits_{ige0}f(i)=prodlimits_{pin Prime}frac1{1-f(p)})
    这个时候考虑 (zeta(s)=sumlimits_{nge1}frac1{n^s}=prodlimits_{pin Prime}frac{p^s}{p^s-1})
    然后就可以构造出 (DGF:F(s)=sumlimits_{nge1}frac{f(n)}{n^s})
    发现你对 (DGF) 卷积就是做了个狄利克雷卷积,于是就可以对 (DGF) 乱操作了,注意到 (ln)(exp) 的正确性是根据 (Lambda(x))(DGF) 分析出来的。
    但你发现这个东西拓展性并不是很强,因此下面介绍更为直观的贝尔级数。
    这个东西就是把上面连乘形式的每一项抽出来,对每个素数进行考虑。
    即定义 (f_p(x)=sumlimits_{ige0}f(p^i)x^i) ,于是 ((f*g)_p(x)=f_p(x)*g_p(x)) ,只需要把给出的函数转成贝尔级数然后乘起来再转回去,在某些推导的时候能轻松一点。
    例题?不存在的,非要说的话就去做狄利克雷k次根


    一个自然数幂和的应用

    (f_0(x)=1,f_k(x)=sumlimits_{i=0}^x(Ai^2+Bi+C)f_{k-1}(i)) ,求 ([x^m]f_0(x),[x^m]f_1(x)...[x^m]f_n(x))
    其中 (nle2*10^5,m,A,B,Cle10^9)

    尝试一下会发现直接推有点难搞,不妨尝试从全局的角度考虑组合意义。
    (g(x)=Ax^2+Bx+C)
    发现相当于现在有 (0,1,...m) 这些点,对于 (ile j) 有权值为 (g(i)) 的边,一条路径的贡献是边权之积,求从 (0)(0,1,...,n) 步到达 (m) 点的所有路径的贡献和。
    发现这是 (m+1) 元完全齐次对称式的生成函数 (H(x)=prodlimits_{i=0}^mfrac1{1-g(i)x}) ,我们要求这个多项式 (0,1...n) 次项的系数。
    容易想到求 (E(x)=prodlimits_{i=0}^m(1-g(i)x)) 再多项式求逆一下。
    直接搞还是不方便,考虑给 (g(x)) 配方一下,相当于问题变成了求 (prodlimits_{i=0}^m(1-(i^2+A)x)) 的系数。
    再考虑对称多项式的结论: (E(x)=frac1{e^{intfrac{P(x)-n}x ext dx}})
    于是只用考虑求 (i^2+A) 的等幂和。
    那么列一下等幂和的式子:

    [egin{aligned} P(x)=&sumlimits_{ige0}frac{x^i}{i!}sumlimits_{j=0}^m(j^2+A)^i\ =&sumlimits_{ige0}x^isumlimits_{j=0}^msumlimits_{k=0}^ifrac{(j^2)^k}{k!}*frac{A^{i-k}}{(i-k)!}\ =&e^{Ax}*sumlimits_{ige0}frac{x^i}{i!}sumlimits_{j=0}^mj^{2i}\ end{aligned} ]

    看看后面那一坨是啥,发现可以先求出 (sumlimits_{i=0}^me^{ix}=frac{e^{(m+1)x}-1}{e^x-1})(0,1...2n) 项然后取出偶数项系数,这题就做完了。
    经过一定的思考,发现把 (g(x)) 改写成 (k) 次多项式目前没法做到比较优秀的复杂度就是博主菜
    观察一下列出来的生成函数本质发现就是列了一个 (sumlimits_{i=0}^me^{g(i)x}) ,这个东西感觉只在当 (g(x)) 除去常数项最多有一项不为 (0) 的时候比较可做。


    二元多项式的一个简单应用

    给一个 (n) 个数的数列,第 (i) 个数是 (a_i), 所有数的和为 (m), 对于一个排列 (p) ,设 (b_i=sumlimits_{i=1}^ja_{p_j}) ,那么这个排列的贡献就是 (frac{m!}{prodlimits_{i=2}^nb_i}) , 问所有排列总贡献。

    考虑转一个组合意义,发现可以把第 (i) 个数看成有 (a_i) 个颜色为 (i) 的带标号球,先假定贡献是 (frac{m!}{prodlimits_{i=1}^nb_i}) ,发现这个东西就是给每个颜色定一个顺序依次插入,限制是每种颜色的球标号为 (1) 的必须放在其它标号的前面,且后插入的球的 (1) 号球必须在序列头。合法序列总数计算出来就是答案,简单推一下发现是 (frac{m!}{prodlimits_{i=1}^na_i})

    假如是题目要求的贡献,那么第一个插入的颜色去掉限制即可。

    于是可以硬点第一次插入的颜色然后容斥一下在它之前插入的,重写答案: (Ans=sumlimits_{t=1}^nsumlimits_{S}(-1)^{|S|}frac{(sumlimits_{iin S}a_i)!}{prodlimits_{iin S}a_i}*inom{(sumlimits_{iin S}a_i)+a_t-1}{a_t-1}*inom{m}{(sumlimits_{iin S}a_i)+a_t}frac{(sumlimits_{i otin S,i ot=t}a_i)!}{prodlimits_{i otin S,i ot=t}a_i})
    然后一波化简可以变成这个: (Ans=frac{m!}{prodlimits_{i=1}^na_i}sumlimits_{t=1}^na_t^2sumlimits_{S}frac{(-1)^{|S|}}{(sumlimits_{iin S}a_i)+a_t})

    推导到这里,大概有以下经典做法:

    1. 直接枚举每个 (t) ,然后把 (sumlimits_{iin S}a_i) 看成状态做 (dp) 算算系数,复杂度是 (O(n^2m))
    2. 发现可以用补集转化的思想优化上面的 (dp) ,复杂度降到了 (O(nm))

    但上述做法没法看出什么明显的优化,因此继续观察可以发现我们相当于枚举出一个集合 (S) ,里面有一个数的贡献是自身权值的平方,其余数的权值是 (-1)
    那么直接记 (f_{i,j,0/1}) 表示考虑前 (i) 种颜色,集合的和为 (j) ,是否选出了平方贡献的数的系数和。
    这个东西直接转移同样可以做到 (O(nm)) 的复杂度,code

    然后冷静一下发现这个组合意义很生成函数,于是可以构造出一个二元生成函数 (F(x,y)=prodlimits_{t=1}^n(1+x^{a_t}(a_t^2y-1)))
    注意到我们只需要最后 ([x^ty]) 的系数,所以可以改写模意义下的数为一个二元组 ((a,b)=a+b*y) ,然后就变成了一个一元函数问题,直接分治 (ntt) 即可。
    当然也可以用博主之前想过的一个 (trick) 优化掉一个 (log) ,大概就是用多项式 (exp) 和分治 (ntt) 平衡一下复杂度。
    这里只写了分治 (ntt) 做法 code


    Lattice Paths and Gaussian Coefficients

    高斯系数

    定义 (g_n(x)=(x-1)(x-q)cdots(x-q^{n-1}), g_0(x)=1), 将这个称作高斯多项式。
    对于等式 (x^n=sumlimits_{k=0}^negin{gather*}egin{bmatrix}n\kend{bmatrix}end{gather*}_qg_k(x)), 把每一项的系数称作高斯系数。
    高斯系数有如下递推式: (egin{gather*}egin{bmatrix}n\mend{bmatrix}end{gather*}_q)(=egin{gather*}egin{bmatrix}n-1\m-1end{bmatrix}end{gather*}_q)(+q^megin{gather*}egin{bmatrix}n-1\mend{bmatrix}end{gather*}_q(nge mge1)),(egin{gather*}egin{bmatrix}n\0end{bmatrix}end{gather*}_q=1)
    由于式子比较难打证明就咕咕咕了,反正挺容易的
    定义 ([n]_q=frac{1-q^n}{1-q},[n]_q!=[n]_q[n-1]_qcdots[1]_q=frac{(1-q^n)(1-q^{n-1})cdots(1-q)}{(1-q)^n}) ,我们把这个叫做 (q-整数)(q-阶乘)
    然后发现这个形式和组合数非常像,可以推出 (egin{gather*}egin{bmatrix}n\mend{bmatrix}end{gather*}_q=frac{[n]_q!}{[m]_q![n-m]_q!}(nge mge0)),所以也有 (egin{gather*}egin{bmatrix}n\mend{bmatrix}end{gather*}_q)(=egin{gather*}egin{bmatrix}n\n-mend{bmatrix}end{gather*}_q)
    类似的,可以定义 (q-上升)/(下降幂),还有 (q-斯特林数), 这里不进行深入讨论。

    格路计数

    在这里讨论的格路计数要求只能向右和向上走。
    现在考虑给每条路径带上权值

    这条路径的权值为(q^{有点的格子数}), 现在要算出所有路径的权值和。
    这个东西就是 (egin{gather*}egin{bmatrix}n+m\mend{bmatrix}end{gather*}_q),没错,证明又咕掉了。

    三个推论

    ((1+xq)(1+xq^2)cdots(1+xq^n)=sumlimits_{k=0}^negin{gather*}egin{bmatrix}n\kend{bmatrix}end{gather*}_qq^{inom{k+1}2}x^k)

    观察一下发现就是单调上升转成单调不降的想法。

    假设有可重集合 (S(k_1,k_2...k_m),s.t. n=sumlimits_{i=1}^mk_i) (表示有 (k_i)(i)),定义 (inv(P)) 表示一个序列 (P) 的逆序对数 ((i<j&&P_i>P_j))
    那么 (egin{gather*}egin{bmatrix}n\k_1k_2k_3...k_mend{bmatrix}end{gather*}_q=sumlimits_{Pin S(k_1,k_2...k_m)}q^{inv(P)})

    证明用归纳法

    (sumlimits_{sigmain P(n)}q^{inv(sigma)}=egin{gather*}egin{bmatrix}nend{bmatrix}end{gather*}_q!)

    证明显然


    关于生成函数方程求数列递推式的一点思考

    假设有 (A(x)F^2(x)+B(x)F(x)+C(x)=0), 能不能快速求 (F(x)) 的递推式。

    首先有求根公式: (F(x)=frac{-B(x)pmsqrt{Delta}}{2A(x)}),带入常数项进行检验一般可以舍掉一根,我们假设最后有 (F(x)=frac{-B(x)-sqrt{Delta}}{2A(x)}), 如果选的是另一个根情况相似。
    然后简单推导一下:

    [egin{aligned} F(x)=&-frac{B(x)+sqrt{Delta}}{2A(x)}\ Rightarrow&sqrtDelta=B(x)-2A(x)F(x)\ F'(x)=&-frac{2Delta A'(x)(B(x)+sqrtDelta)-A(x)(2B'(x)Delta+Delta'sqrtDelta)}{4A^2(x)Delta}\ Rightarrow&sqrtDelta=frac{-4A^2(x)Delta F'(x)+2Delta(A(x)B'(x)-A'(x)B(x))}{2Delta A'(x)-A(x)Delta'}\ end{aligned} ]

    发现可以建立 (F(x))(F'(x)) 的关系,大概在 (A(x),B(x),C(x)) 很好算的时候就能解出来了。
    下面简单尝试一下,考虑带入卡特兰数的生成函数方程。
    由于 (xF^2(x)-F(x)+1=0), 对应一下就发现有 (A(x)=x,B(x)=-1,C(x)=1,Delta=1-4x)

    [egin{aligned} sqrtDelta=&1-2xF(x)\ sqrtDelta=&frac{-4x^2(1-4x)F'(x)+(2-8x)}{2-4x}\ Rightarrow&(2-4x)-(1-2x)4xF(x)=(4x^2-x)4xF'(x)+(2-8x)\ Rightarrow&(4x^2-x)F'(x)+(1-2x)F(x)=1\ forall n>0&,4(n-1)f_{n-1}-nf_n+2f_{n-1}-f_n=0\ end{aligned} ]

    相信接下来的步骤大家都会了,例子就举到这里。
    接下来尝试能不能更进一步。
    考虑不带入实值,直接对上面的 (F(x),F'(x)) 建立等式,发现可以写成这样的形式: (F(x)*P(x)+F'(x)*Q(x)+T(x)=0)
    假设 (A(x),B(x),C(x)) 的度数同阶,都为 (m),那么不难发现 (P(x),Q(x),T(x)) 的度数大概在 (m^3) 的样子。
    这也告诉我们 (f_1,f_2...) 这个数列可以被写成一个 (m^3) 阶递推的形式,但简单观察后容易发现这是非常系数的递推,所以看起来很难通过 (BM) 这种不动脑子的东西找递推式,因此每次大概只能暴力或者手玩出 (P(x),Q(x),T(x)) 然后进行递推。


    Vandermond Matrix 的一些性质

    (det) 及一种基于 ( ext{the involution principle}) 的证明,也可以直接归纳法证明。
    快速求 (det):
    先考虑一个没有经过大脑思考的做法,考虑求 (prodlimits_{1le i ot=jle n}(x_i-x_j)) 然后开根,这个是显然的多点求值的形式,然而你并不知道该取那个根作为答案所以这个做法gg了
    但上述做法同样有可以借鉴的地方,考虑这么一个算法: 我们暴力分治做,然后 (merge) 的时候拿左子树的积在右子树多点求值一下,复杂度 (O(M(n)log^2n)).
    尝试做到更快?
    考虑有什么地方可以进行优化,发现上述做法会对每个节点取模 (log n) 次,观察一下发现这 (log n) 个乘积是不交的,所以可以把对单个节点取模的次数降到 (1) 次,复杂度降为了 (O(M(n)log n))
    ( ext{Inverse}:)
    直接爆算伴随矩阵固然是好方法,但 ( ext{Vandermond matrix}) 比较特殊,可以考虑观察它的一些性质来更优美的求逆。
    首先来入门一下对称多项式
    求逆的出发点仍然是伴随矩阵,我们考虑求如下矩阵的 (det):
    (V_i=egin{gathered}egin{pmatrix} 1 & 1 & ... & 1\x_1 & x_2 & ... & x_n\...\x_1^{i-1} & x_2^{i-1} & ... & x_n^{i-1}\x_1^{i+1} & x_2^{i+1} & ... & x_n^{i+1}\...\x_1^n & x_2^n & ... & x_n^nend{pmatrix}end{gathered})
    这个看起来很有规律,但不好直接下手,因此补上一列 (x) 来求:
    (f(x)=detegin{gathered}egin{pmatrix} 1 & ... & 1 & 1\x_1 & ... & x_n & x\...\x_1^n & ... & x_n^n & x^nend{pmatrix}end{gathered}=prodlimits_{i=1}^n(x-x_i)prodlimits_{i>j}(x_i-x_j))
    根据 ( ext{Laplace}) 展开定理和上式有: ([x^i]=(-1)^{i+n+2}det V_i=(-1)^{n-i}e_{n-i}(x_1,x_2...x_n)prodlimits_{i>j}(x_i-x_j))
    (Rightarrowdet V_i=e_{n-i}(x_1,x_2...x_n)prodlimits_{i>j}(x_i-x_j))
    现在设 (V=egin{gathered}egin{pmatrix} 1 & 1 & ... & 1\x_1 & x_2 & ... & x_n\...\x_1^{n-1} & x_2^{n-1} & ... & x_n^{n-1}end{pmatrix}end{gathered})
    那么根据上面的推导,可以轻松算出 ((V^{-1})_{i,j}=(-1)^{i+j}frac{e_{n-1-j}({x_1,x_2...x_n}ackslash{x_i})prodlimits_{a>b,a ot=i,b ot=i}(x_a-x_b)}{prodlimits_{a>b}(x_a-x_b)}=(-1)^{i+j}frac{e_{n-1-j}({x_1,x_2...x_n}ackslash{x_i})}{prodlimits_{a>b,a=i ext{ or }b=i}(x_a-x_b)})
    另一方面,从插值与求值的角度可以同样可以说明逆矩阵长成上述的样子。

    Lagrange 插值
    如果已知 (f(x))(n) 个点值 ((x_1,y_1),(x_2,y_2)...(x_n,y_n),forall i ot=j, x_i ot=x_j),可以构造出一个满足经过这 (n) 个点的 (n-2) 次多项式。
    考虑构造,首先有 (f(x_0)=f(x)mod x-x_0),所以现在得到了 (n) 个同余方程组 (f(x)equiv y_imod x_i)
    那么利用中国剩余定理,就可以快速构造一个多项式 (sumlimits_{i=1}^ny_iprodlimits_{j ot=i}frac{x-x_j}{x_i-x_j})

    现在考虑用线性代数来理解,首先求点值可以看成建一个关于 (x_1,x_2...x_n)( ext{Vandermonde matrix}),这样有 (egin{gathered}egin{pmatrix} f_0 & f_1 & ... & f_{n-1}end{pmatrix}end{gathered}*V=egin{gathered}egin{pmatrix} y_1 & y_2 & ... & y_{n}end{pmatrix}end{gathered}),给两边同乘一个逆矩阵,就有 (egin{gathered}egin{pmatrix} y_1 & y_2 & ... & y_{n}end{pmatrix}end{gathered}*V^{-1}=egin{gathered}egin{pmatrix} f_0 & f_1 & ... & f_{n-1}end{pmatrix}end{gathered})
    那么 ((V^{-1})_{i,j}) 显然就是 (prodlimits_{k ot=i}frac{x-x_k}{x_i-x_k})(j-1) 次项系数,与之前推导出的结果一致。

  • 相关阅读:
    C/C++ 构造函数不能是虚函数
    C/C++ STL迭代器失效
    Linux fork函数
    算法和数据结构 限流算法
    数据库 redis底层实现
    C/C++ 虚析构函数
    万物皆可 Serverless 之使用云函数 SCF 快速部署验证码识别接口
    万物皆可 Serverless 之使用云函数 SCF+COS 免费运营微信公众号
    腾讯云云函数 SCF 日志检索最佳实践
    江娱互动「世界争霸」产品迁移至腾讯云云函数的实践
  • 原文地址:https://www.cnblogs.com/ldxcaicai/p/12727745.html
Copyright © 2020-2023  润新知