emmm……其实早在今年 2 月时就该做这个总结了,可是不知道因为什么原因鸽掉了,今天得知 ycx 也在学线代就着手做了这个总结。
过于基础的芝士,譬如什么是矩阵、向量、矩阵乘法之类的东西就一笔带过了(
1. 线性方程组
对于一个 \(n\) 个方程 \(m\) 个未知数的方程组
我们定义它的增广矩阵 \(A\) 为:
我们定义作用在一个矩阵上的初等行变换为以下三种变换:
- 倍加变换:即把一个行的 \(\lambda\) 倍加到另一行上
- 对换变换:交换两行
- 倍乘变换:将某一行所有数都乘以一个非零实数 \(\lambda\)
显然初等行变换可逆。
可以说明,对于某个矩阵我们可以通过初等行变换将其变为上三角矩阵,也就是如下图所示的矩阵:
即满足以下条件的矩阵:
- 每一行如果存在非零元素,那么从左到右数第一个非零元素为 \(1\)
- 对于相邻两行,上一行非零元素的位置严格前于下一行非零元素的位置(或者两行都不存在非零元素,或者下一行不存在非零元素)
满足上述条件的矩阵又被称为阶梯型矩阵。
将一个矩阵通过初等行变换变为阶梯型矩阵的过程又被称为高斯消元,具体步骤可以戳这里
我们对线性方程组的增广矩阵进行高斯消元,那么根据初等行变换的定义可知,初等行变换前后方程组的解集是不会发生变化的,因此我们可以通过化简之后解的情况反推化简前的解的情况。显然最终得到的简化阶梯型矩阵有三种可能:
- 存在一行满足前 \(m\) 个元素均为 \(0\),第 \(m+1\) 个元素非零,此时该方程组无解。
- 恰有 \(m\) 行存在非零元素,此时该方程组有唯一解
- 存在非零元素的行数 \(<m\),此时该方程有无数组解
对于二、三两种情况,我们称该增广矩阵是相容的。
证明是显然的,因为对于第一种情况,它等价于出现了 \(0x_1+0x_2+\cdots+0x_m=k(k\ne 0)\) 的情况,此时方程组显然无解。而对于第二种情况,我们一定找到一行形如 \(x_m=a_{m,m+1}\),此时我们可以求出 \(x_{m}\) 的值,然后我们把它代入上一行(显然形如 \(x_{m-1}+a_{m-1,m}x_m=a_{m-1,m+1}\))可以求出 \(x_{m-1}\),以此类推即可求出方程组的唯一解,这个在我高斯消元学习笔记中都有所提及。比较棘手的是第三种情况,显然我们仅仅知道它有无穷多组解是远远不够的,我们还希望能够知道它的通解,此时就需要用到一个东西叫简化阶梯型矩阵了。
事实上阶梯型矩阵还可以继续化简,我们考虑用每一行上最左边的 \(1\) 去消这些 \(1\) 正上方的元素,那么我们可以得到一个以下形式的矩阵:
这样的矩阵就被称作简化阶梯型矩阵,将一个矩阵由阶梯型转化为简化阶梯型的过程又被称为”高斯约旦消元“。
显然它有如下性质:
- 每一行第一个非零元素均为 \(1\),且这样的 \(1\) 均为该列唯一的 \(1\)
那么对于存在唯一解的方程的增广矩阵,它化简出来的简化阶梯型矩阵一定如下所示:
此时可以直接得出它的解。
否则我们假设存在 \(k\) 行存在非零元素,那么显然一定也存在 \(k\) 列满足该列只有一个元素非零,该元素值为 \(1\),且该元素 \(1\) 为其所在行从左往右数第一个非零元素,我们称这样的列为主元列,其余列为非主元列。
那么对于该方程组的所有解,其主元都可以表示成非主元(aka 自由元)的形式。换句话说,假设我们已经知道了非主元的值,那么该方程组的解就固定了。具体构造就是假设非主元依次为 \(i_1,i_2,\cdots,i_{m-k}\),那么我们在方程组中把所有非主元列上的数都移到右边,得到的增广矩阵显然如下所示:
此时就可以直接写出它们的解了。
2. 向量与线性组合、线性相关
提前声明:
以下内容摘自我的线性基学习笔记,由于我比较懒就不愿意重新写一遍了
向量
一个 \(n\) 维向量是一个 \(n\) 元有序数组 \(\vec{v}=(a_1,a_2,\cdots,a_n)\),记作 \(\vec{v}\in\mathbb{R}^n\)。
对于向量 \(\vec{u}=(a_1,a_2,\cdots,a_n),\vec{v}=(b_1,b_2,\cdots,b_n)\),我们定义以下运算:
- \(\vec{u}+\vec{v}=(a_1+b_1,a_2+b_2,\cdots,a_n+b_n)\)
- \(\vec{u}-\vec{v}=(a_1-b_1,a_2-b_2,\cdots,a_n-b_n)\)
- 对于 \(k\in\mathbb{R},k\vec{u}=(ka_1,ka_2,\cdots,ka_n)\)
- \(\vec{u}·\vec{v}=\sum\limits_{i=1}^na_ib_i\)
注意:在线性代数中有个不成文的规定,就是向量 \(\vec{v}\in\mathbb{R}^n\) 可以看作是仅含一列,也就是 \(n\times 1\) 的矩阵,也就是列向量,因此上面的写法可能有点不严谨(
线性组合与张成空间
对于向量集 \(V=\{\vec{v_1},\vec{v_2},\cdots,\vec{v_n}\},v_i\in\mathbb{R}^m\) 和向量 \(x\in\mathbb{R}^m\),如果 \(\exist c_1,c_2,\cdots,c_n\in R\) 满足 \(c_1v_1+c_2v_2+\cdots+c_nv_n=x\),则称 \(x\) 为 \(V\) 以 \(c_1,c_2,\cdots,c_n\) 为权的线性组合。所有这样的 \(x\) 组成的集合称为 \(V\) 的张成空间,记作 \(\text{Span}(V)\)
线性相关
关于这东西最原始的定义是,一个向量集 \(V=\{\vec{v_1},\vec{v_2},\cdots,\vec{v_n}\},v_i\in\mathbb{R}^m\) 为线性无关集,当且仅当方程 \(\vec{v_1}x_1+\vec{v_2}x_2+\cdots+\vec{v_n}x_n=0\) 的唯一解为 \(x_i=i,i\in[1,n]\)。反之称其为线性有关集。
当然还有不少等价的定义,一个比较常用的定义是向量集 \(V=\{\vec{v_1},\vec{v_2},\cdots,\vec{v_n}\}\) 为线性有关集,当且仅当 \(\exist j\in[1,n]\) 满足 \(v_j\) 可以表示为 \(\vec{v_1},\vec{v_2},\cdots,\vec{v_{j-1}}\) 的线性组合。
一个小性质是若 \(n>m\),则 \(V\) 必然为线性有关集,证明可用高斯消元,这里就不再赘述了。
判定一个集合是否为线性无关集就对矩阵 \(A=\begin{bmatrix}\vec{v_1}&\vec{v_2}\cdots&\vec{v_n}\end{bmatrix}\) 进行高斯消元并检查主元列个数是否为 \(n\) 即可。
3. 矩阵方程与线性变换
矩阵方程
形如 \(A\vec{x}=\vec{b}\) 的方程被称为矩阵方程,其中 \(A\) 为 \(n\times m\) 的矩阵,\(\vec{u}\in\mathbb{R}^n\),\(\vec{x}\in\mathbb{R}^m\)
显然它只是将线性方程组
用向量的语言表述了而已。
齐次方程
在上面的矩阵方程 \(A\vec{x}=\vec{b}\) 中,如果 \(\vec{b}=\vec{0}\),那么该方程又被称为齐次方程。
显然任何齐次方程都有平凡解 \(\vec{x}=\vec{0}\),因此我们只用探究 \(\vec{x}\) 不是零向量的解即可。
根据上文”简化阶梯型“部分中的推导过程,任何一个相容的增广矩阵都可以通过高斯消元+高斯约旦消元变成下面的形式:
其中 \(m\) 为矩阵 \(A\) 的列数,\(k\) 为主元个数,\(i_1,i_2,\cdots,i_{m-k}\) 为 \(m-k\) 个自由元的编号。
又因为 \(\vec{b}=\vec{0}\),因此不论怎么进行初等行变换,最后一列上每个元素永远是 \(0\),因此最终 \(a_1=a_2=\cdots=a_m=0\),因此矩阵方程 \(A\vec{x}=\vec{b}\) 的解可以表示为如下的形式:
其中 \(x_{i_t}\) 为第 \(t\) 个自由元的取值,\(\vec{v_t}\) 为第 \(t\) 个自由元所在列组成的向量对应到变量的向量,或者严谨一点,我们假设第 \(i\) 行的主元编号为 \(s_i\),那么 \(\vec{v_t}\) 第 \(s_j\) 行的元素为 \(a_{j,i_t}\),第 \(i_t\) 行的元素为 \(1\),其余元素均为 \(0\) 。也就是说,矩阵方程 \(A\vec{x}=\vec{b}\) 的解可以表示为 \(\vec{v_1},\vec{v_2},\cdots,\vec{v_{m-k}}\) 的线性组合,该形式又被称为矩阵方程解的向量表示形式。
同理,仿照上述证明过程我们也可以得出,对于 \(\vec{b}\ne\vec{0}\) 的矩阵方程,其通解可以写作 \(\vec{v_0}-x_{i_1}\vec{v_1}-x_{i_2}\vec{v_2}-\cdots+x_{i_{m-k}}\vec{v_{m-k}}\),其中 \(\vec{v_0}\) 为该方程所有自由元都取 \(0\) 时的特解,\(\vec{v_t}(t>0)\) 的定义同上。
线性变换
对于一个 \(\mathbb{R}^n\to\mathbb{R}^m\) 的变换 \(T\),我们定义其为线性变换,当且仅当:
- \(\forall \vec{u},\vec{v}\in\mathbb{R}^n,T(\vec{u}+\vec{v})=T(\vec{u})+T(\vec{v})\)
- \(\forall k\in\mathbb{R},\vec{u}\in\mathbb{R}^n,T(k\vec{u})=kT(\vec{u})\)
那么可以证明:一定 \(\exists\) 一个 \(m\times n\) 的矩阵 \(A\),满足 \(T(\vec{u})=A\vec{u}\)。
证明:
首先根据 \(T\) 是线性变换可以推出:
- \(T(\vec{0})=\vec{0}\)(提示:\(T(\vec{0})=T(k\vec{u}+(-k)\vec{u})=T(k\vec{u})+T(-k\vec{u})=kT(\vec{u})-kT(\vec{u})=\vec{0}\))
- \(T(a\vec{u}+b\vec{v})=aT(\vec{u})+bT(\vec{v})\)(提示:\(T(a\vec{u}+b\vec{v})=T(a\vec{u})+T(b\vec{v})=aT(\vec{u})+bT(\vec{v})\))
我们设 \(\vec{e_i}\) 表示满足第 \(i\) 个元素为 \(1\),其余元素均为 \(0\) 的向量,那么假设 \(\vec{w_i}=T(\vec{e_i})\)。显然对于一个向量 \(\vec{x}\in\mathbb{R}^n\) 而言,必然有 \(\vec{x}=x_1\vec{e_1}+x_2\vec{e_2}+\cdots+x_n\vec{e_n}\),此时根据之前的推论有 \(T(\vec{x})=x_1T(\vec{e_1})+x_2T(\vec{e_2})+\cdots+x_nT(\vec{e_n})=x_1\vec{w_1}+x_2\vec{w_2}+\cdots+x_n\vec{w_n}\),设 \(A=\begin{bmatrix}\vec{w_1}&\vec{w_2}&\cdots&\vec{w_n}\end{bmatrix}\),那么上式可以写作 \(T(\vec{x})=A\vec{x}\),证毕。
该矩阵 \(A\) 又被称为变换 \(T\) 的标准矩阵。
在 OI 中,你所熟知的变换(如 DFT、IDFT、FWT、IFWT)都是线性变换。
4. 向量空间与坐标系
向量空间
一个向量集合 \(V\) 被称为向量空间当且仅当对于任意两个 \(V\) 中的向量,它们的任意倍数与和/差都在 \(V\) 中,即 \(V\) 中的元素加减法封闭的。
显然 \(\mathbb{R}^n\) 为向量空间,另一典型的向量空间是一有限向量集 \(V'\) 的生成空间 \(\text{Span}(V')\)
基
对于向量空间 \(S\),如果有限向量集合 \(B\) 为线性无关集且 \(\text{Span}(B)=S\),就称 \(B\) 为 \(S\) 的一组基。
基有如下一些性质:
- \(B\) 的任何一个真子集都不是 \(\text{Span}(B)\) 的基(提示:反证法)
- 对于 \(\text{Span}(B)\) 中任意一个向量 \(v\) 都存在唯一的 \(c_1,c_2,\cdots,c_{|B|}\) 使得 \(v\) 为以 \(B\) 以 \(c_1,c_2,\cdots,c_{|B|}\) 为权的线性组合(提示:反证法+做差,推出 \(B\) 线性有关)
- 对于线性有关集 \(V\),存在 \(B\subset V\) 且 \(\text{span}(B)=\text{span}(V)\)(提示:根据线性有关集的定义)
定义 \(n\) 阶标准基为:单位矩阵 \(I_n\) 的列向量组成的集合。
几个定义
接下来抛几个定义:
- 矩阵的零空间:对于 \(n\times m\) 的矩阵 \(A\),根据第三部分的推论,满足 \(A\vec{x}=\vec{0}\) 的向量 \(\vec{x}\) 显然组成一个空间,我们称之为矩阵 \(A\) 的零空间,记作 \(\text{Nul}\,A\)
- 矩阵的列空间:对于 \(n\times m\) 的矩阵 \(A\),定义其列空间为其列向量生成的空间,记作 \(\text{Col}\,A\)
- 向量空间的维数:对于向量空间 \(S\),定义其维数为其基的大小,记作 \(\text{dim}\,S\)。
- 矩阵的秩:对于 \(n\times m\) 的矩阵 \(A\),我们定义其秩为其列空间的维数,记作 \(\text{rank}\,A=\text{dim}\,\text{Col}\,A\),显然矩阵的秩就是其主元的个数。
从上面的定义中,我们能够证明:
- \(S\) 中所有基的大小都相同。这里稍微 yy 一下证明,假设 \(S\) 有两个不同的子集 \(A,B\),满足它们都生成 \(S\),且 \(|A|<|B|\),那么不妨设 \(A=\{\vec{u_1},\vec{u_2},\cdots,\vec{u_t}\}\),根据基的定义可知 \(\forall \vec{v_i}\in B\),必然 \(\exists b_j\in\mathbb{R}\),满足 \(\vec{v_i}=b_1\vec{u_1}+b_2\vec{u_2}+\cdots+b_t\vec{u_t}\),我们记 \(\vec{w_i}=(b_1,b_2,\cdots,b_t)\),那么由于 \(|B|>|A|\),因此 \(\vec{w_1},\vec{w_2},\cdots\vec{w_{|B|}}\) 必然不是线性无关集,因此必然存在某个 \(\vec{w_i}\) 可以表示为其他 \(\vec{w_j}\) 的线性组合,对应的 \(\vec{b_i}\) 也就可以表示为其他 \(\vec{b_j}\) 的线性组合,与基的定义矛盾。因此 \(S\) 中所有基的大小都相同。根据这个我们也可以得到以下推论:对于 \(S\) 中任意大小大于 \(\text{dim}\,S\) 的子集都是线性有关集。
- 根据第三部分的推导过程,\(\text{dim}\,\text{Nul}\,A\) 等于 \(A\) 中自由元的个数,又 \(\text{rank}\,A=\text{dim}\,\text{Col}\,A\) 为 \(A\) 中主元的个数,因此我们能得出 \(\text{dim}\,\text{Nul}\,A+\text{rank}\,A=m\)。
坐标系
对于某个向量空间 \(S\) 中的某个基 \(\mathcal B=\{\vec{v_1},\vec{v_2},\cdots,\vec{v_m}\}\),根据基的定义显然有 \(\forall \vec{u}\in S\),用 \(\mathcal B\) 中的元素表示 \(\vec{u}\) 的方式是唯一的,即存在唯一的序列 \(w_i\in\mathbb{R}\),满足 \(w_1\vec{v_1}+w_2\vec{v_2}+\cdots+w_m\vec{v_m}=\vec{u}\),我们就称 \(\begin{bmatrix}w_1&w_2&\cdots&w_m\end{bmatrix}\) 为 \(\vec{u}\) 关于 \(\mathcal B\) 的坐标向量 \([\vec{u}]_{\mathcal B}\)。
那么根据上面的式子我们可以看成,如果我们记 \(A_{\mathcal B}=\begin{bmatrix}\vec{v_1}&\vec{v_2}&\cdots&\vec{v_m}\end{bmatrix}\),有 \(\vec{u}=A_{\mathcal B}[\vec{u}]_{\mathcal B}\),以及 \([\vec{u}]_{\mathcal B}=A_{\mathcal B}^{-1}\vec{u}\),此时我们称 \(A_{\mathcal B}\) 为 \(\mathcal B\) 到标准基之坐标变换矩阵
5. 矩阵代数
矩阵的逆
定义 \(n\times n\) 的矩阵 \(A\) 的逆为满足 \(AB=I_n\) 的矩阵 \(B\),记作 \(A^{-1}=B\)。当然并不是所有矩阵都存在逆,譬如全 \(0\) 矩阵的逆就不存在。可以证明,一个矩阵 \(A\) 的逆存在,当且仅当 \(A\) 可以通过初等行变换变成 \(I_n\)。
那么怎么求一个矩阵的逆呢?我们考虑这样一个过程:我们在原来的矩阵右边拼上一个 \(I_n\),将原来的矩阵扩充为 \(n\times 2n\) 的矩阵,然后我们通过初等行变换将左边的矩阵变为 \(I_n\),并将对左边矩阵的作用全部施加在右侧的 \(I_n\),此时右边的矩阵就是 \(A^{-1}\)。
为什么?考虑初等行变换的本质:实际上是将矩阵变为矩阵与另一个矩阵的乘积,因此一个矩阵经过一系列初等行变换的结果也可以看作是将该矩阵乘上另一个矩阵,因此将 \(A\) 变为 \(I_n\) 可以看作对 \(A\) 乘上一个矩阵 \(B\) 后变成了 \(I_n\),因此 \(AB=I_n\),故 \(B=A^{-1}\),而我们又将该作用施加于 \(I_n\) 上,故 \(I_n\) 会变为 \(I_n\times B=B=A^{-1}\),这样我们就可以得到我们想要的 \(A^{-1}\) 了。
模板题代码(终于与 OI 有点关系了)
const int MAXN=400;
const int MOD=1e9+7;
int qpow(int x,int e){
int ret=1;
for(;e;e>>=1,x=1ll*x*x%MOD) if(e&1) ret=1ll*ret*x%MOD;
return ret;
}
int n,a[MAXN+5][MAXN*2+10];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
a[i][i+n]=1;
for(int j=1;j<=n;j++) scanf("%d",&a[i][j]);
}
for(int i=1;i<=n;i++){
int t=0;
for(int j=i;j<=n;j++) if(a[j][i]){t=j;break;}
if(!t) return puts("No Solution"),0;
for(int j=i;j<=2*n;j++) swap(a[i][j],a[t][j]);
int iv=qpow(a[i][i],MOD-2);
for(int j=i;j<=2*n;j++) a[i][j]=1ll*a[i][j]*iv%MOD;
for(int j=i+1;j<=n;j++){
for(int k=i+1;k<=2*n;k++) a[j][k]=(a[j][k]-1ll*a[j][i]*a[i][k]%MOD+MOD)%MOD;
a[j][i]=0;
}
}
for(int i=n;i;i--){
for(int j=i+1;j<=n;j++){
for(int k=n+1;k<=2*n;k++) a[i][k]=(a[i][k]-1ll*a[i][j]*a[j][k]%MOD+MOD)%MOD;
a[i][j]=0;
} int iv=qpow(a[i][i],MOD-2);
for(int j=i+1;j<=n;j++) a[i][j]=1ll*a[i][j]*iv%MOD;
}
for(int i=1;i<=n;i++) for(int j=n+1;j<=2*n;j++)
printf("%d%c",a[i][j],(j==2*n)?'\n':' ');
return 0;
}
行列式
别的在我链接指向的那篇垃圾的 blog 里都写的很清楚了,这里稍微再补充一句,对于序列 \(x_1,x_2,\cdots,x_n\in\mathbb{R}\),有:
上式又被称为范德蒙德行列式。
积和式
对于 \(n\times n\) 的矩阵 \(A\),我们定义其积和式为
其中 \(p\) 为一个 \(1\sim n\) 的排列。
对于一个 \(n\times n\) 的矩阵,积和式与行列式奇偶性相同(不过似乎没什么卵用)
积和式可以简单看作行列式去掉前面 \((-1)^{\tau(p)}\) 的系数的版本,但是与行列式不同的一点是积和式没有较为容易的求法,因此在 OI 中应用不是太广泛。似乎积和式可以用来求二分图完美匹配个数,我在群里问了这个问题竟然还把 EI、myh 和 jly 请出来了/yun
跑题了跑题了
余子式
将矩阵第 \(i\) 行第 \(j\) 列去掉,剩余的 \((n-1)\times(n-1)\) 的矩阵的行列式就被称为余子式,写作 \(M_{i,j}\)。令 \(B_{i,j}=(-1)^{i+j}A_{i,j}\),那么我们称 \(B_{i,j}\) 为矩阵 \(A\) 的 \((i,j)\) 元代数余子式。
矩阵代数余子式允许矩阵行列式按一行展开:
还有一个求逆的公式我不知道有什么用:
右边的矩阵又被称为矩阵 \(A\) 的伴随矩阵,简称 \(\text{adj}\,A\)
特征值与特征向量
定义一个值 \(\lambda\) 为矩阵 \(A\) 的特征值当且仅当方程 \(A\vec{x}=\lambda\vec{x}\) 有非平凡解,此时 \(\vec{x}\) 被称为 \(A\) 的特征向量。
上述方程可以被化为 \((A-\lambda I)\vec{x}=\vec{0}\),根据定义 \(\vec{x}\ne\vec{0}\),因此依据上文该方程有非平凡解当且仅当 \(A-\lambda I\) 不是满秩矩阵,即 \(\det(A-\lambda I)=0\),此时满足条件的 \(\vec{x}\) 显然构成一个向量空间,我们称之为矩阵 \(A\) 关于 \(\lambda\) 之特征空间。
如果我们记 \(f(\lambda)=\det(A-\lambda I)\),那么 \(f(\lambda)\) 为关于 \(\lambda\) 的 \(n\) 次多项式,我们称之为矩阵 \(A\) 的特征多项式。因此一个矩阵 \(A\) 恰有 \(n\) 个特征值,对于一个数 \(\lambda\),如果它在 \(f(\lambda)=0\) 的根中出现了 \(k\) 次,我们就称 \(k\) 为 \(\lambda\) 的重数。一个定理是一个矩阵 \(A\) 所有特征值的乘积等于 \(\det A\)
至于怎么求特征值……非常显然,上三角/下三角矩阵的特征值就是其对角线上的元素,但对于一般的矩阵并没有什么特别好的办法,所以 OI 里面一般只会在推式子中用到矩阵的特征值,最多只需懂得如何对于一个给定的特征值,求出其对应的特征空间即可。
Cayley-Hamilton定理(C-H 定理)
这个定理我真的不知道有啥用,只是在这题题解区看到了这个东西就打算将其写进去了……
大概就是记 \(\lambda_1,\lambda_2,\cdots,\lambda_n\) 为一个 \(n\times n\) 矩阵的 \(n\) 个特征值,那么有
也就是说假设 \(A\) 的特征多项式 \(f(\lambda)=\sum\limits_{i=0}^nb_i\lambda^i\),那么 \(\sum\limits_{i=0}^nb_iA^i=0\)
证明直接不会
相似与对角化
对于两个 \(n\) 阶方阵 \(A,B\),如果存在矩阵 \(P\) 满足 \(A=PBP^{-1}\),则称矩阵 \(A,B\) 相似。
如果两个矩阵 \(A,B\) 相似,那么有一个非常好的性质就是 \(A^k=(PBP^{-1})^k=PB^kP^{-1}\),如果 \(B\) 能够有比较好的性质,那么我们能够在较快的时间内求出 \(A^k\)。
对于一个行列式互不相同的矩阵 \(A\),有一个定理是从它所有特征值的特征空间中任取一个向量,得到的大小为 \(n\) 的集合为线性无关集。对于这样的矩阵 \(A\),我们能够构造出一个与其相似的、并且只有对角线上元素非零的矩阵 \(D\),具体构造就是求出 \(A\) 的特征值作为 \(D\) 对角线上的元素,那么 \(P\) 就是以 \(A\) 的 \(n\) 个特征值对应的特征向量为列向量的矩阵。
利用对角化可以在严格 \(\mathcal O(n^3)\) 的时间内求出一个上三角且对角线上元素矩阵互不相同的矩阵 \(A\) 的 \(k\) 次幂。
例题:Codeforces 923E Perpetual Subtraction
看到特征向量的高次幂可以想到对角化。
打个表可以发现对于给出的矩阵 \(A\),其第 \(i\) 个特征向量的第 \(j\) 维为 \((-1)^{i+j}\dbinom{i}{j}\)
对角化一下可以得到 \(A=PBP^{-1}\),其中 \(B\) 为对角矩阵,且 \(B_{i,i}\) 为 \(A\) 第 \(i\) 个特征根,即 \(\dfrac{1}{i+1}\),\(P\) 为以 \(A\) 的 \(n+1\) 个特征向量为列向量构成的矩阵,打个表还可以发现 \(P^{-1}\) 第 \(i\) 行第 \(j\) 列上的元素为 \(\dbinom{i}{j}\)。
于是有 \(A^m=(PBP^{-1})^m=PB^mP^{-1}\),故 \(\begin{bmatrix}ans_0\\ans_1\\ans_2\\\vdots\\ans_n\end{bmatrix}=PB^mP^{-1}\begin{bmatrix}p_0\\p_1\\p_2\\\vdots\\p_n\end{bmatrix}\),NTT 优化一下即可实现 \(n\log n\) 求解。
代码就不放了,和我两个月前生成函数的做法差不多。
参考资料: