定理:相似矩阵特征多项式相同。

证明:|\rm PAP^{-1}-\lambda E|∣PAP−1−λE∣
=|\rm PAP^{-1}-\lambda PP^{-1}|=∣PAP−1−λPP−1∣
=|\rm (PA-\lambda P)P^{-1}|=∣(PA−λP)P−1∣
=|\rm P(A-P^{-1}\lambda P)P^{-1}|=∣P(A−P−1λP)P−1∣
=|\rm P(A-\lambda E)P^{-1}|=∣P(A−λE)P−1∣
=|\rm P|\times|A-\lambda E|\times |P^{-1}|=∣P∣×∣A−λE∣×∣P−1∣
=|A-\lambda E|=∣A−λE∣

考虑如何求出矩阵特征多项式。

朴素的消元方法由于涉及多项式运算,复杂度显然高于 O(n^3)O(n3)。

实对称阵可以相似对角化,但一般数域上的矩阵并不都能相似对角化,但可以消成如下类似对角矩阵的形式。

\begin{pmatrix} a_{1,1} & a_{1,2} & a_{1,3} & a_{1,4} & a_{1,5} \\ a_{2,1} & a_{2,2} & a_{2,3} & a_{2,4} & a_{2,5} \\ & a_{3,2} & a_{3,3} & a_{3,4} & a_{3,5} \\ & & a_{4,3} & a_{4,4} & a_{4,5} \\ & & & a_{5,4} & a_{5,5} \end{pmatrix} \quad⎝⎜⎜⎜⎜⎜⎛​a1,1​a2,1​​a1,2​a2,2​a3,2​​a1,3​a2,3​a3,3​a4,3​​a1,4​a2,4​a3,4​a4,4​a5,4​​a1,5​a2,5​a3,5​a4,5​a5,5​​⎠⎟⎟⎟⎟⎟⎞​

方法:构造初等矩阵 \rm PP 令 \rm A\leftarrow PAP^{-1}A←PAP−1 实现消元。

则用 a_{i+1,i}ai+1,i​ 消 a_{j,i}(j>i+1)aj,i​(j>i+1) 时,左乘和右乘分别相当于进行初等行变换 R_{j}\leftarrow R_j+kR_{i+1}Rj​←Rj​+kRi+1​ 和初等列变换 C_{i+1}\leftarrow C_{i+1}-kC_jCi+1​←Ci+1​−kCj​,由于 i<i+1<ji<i+1<j,可以注意到初等列变换不影响已消元部分,初等行变换仅影响当前要消的以及未消元部分。

化成如上矩阵后,可以轻易计算特征多项式。

考虑递推求解前 ii 行 ii 列的答案多项式 f_i(x)fi​(x)。显然边界是 f_0(x)=1f0​(x)=1。

观察矩阵可以发现,选取位于 a_{1,1},a_{2,2},\cdots,a_{j-1,j-1},a_{j,i},a_{j+1,j},a_{j+2,j+1},\cdots,a_{i,i-1}(1\le j\le i)a1,1​,a2,2​,⋯,aj−1,j−1​,aj,i​,aj+1,j​,aj+2,j+1​,⋯,ai,i−1​(1≤j≤i) 的元素是唯一有贡献部分,其贡献为 -f_{j-1}a_{j,i}\prod\limits_{k=j}^{i-1}a_{k+1,k}(j<i)−fj−1​aj,i​k=j∏i−1​ak+1,k​(j<i)。后面这部分显然可以直接递推。特别地,对于 j=ij=i,有额外贡献 xf_{i-1}xfi−1​。

于是我们可以 O(n^3)O(n3) 地计算出矩阵的特征多项式。

用途:写奇怪的 |\rm A-kE|∣A−kE∣ 多点求值板子。

据说可以加速矩阵快速幂,先咕着。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=502,p=998244353;
int a[N][N],f[N];
int n,i,j,k,x,y,r,q;
template<typename typC> void read(register typC &x)
{register int c=getchar(),fh=1;while ((c<48)||(c>57)){if (c=='-') {c=getchar();fh=-1;break;}c=getchar();}x=c^48;c=getchar();while ((c>=48)&&(c<=57)){x=x*10+(c^48);c=getchar();}x*=fh;
}
inline void inc(register int &x,const int y)
{if ((x+=y)>=p) x-=p;
}
inline void dec(register int &x,const int y)
{if ((x-=y)<0) x+=p;
}
inline int ksm(register int x,register int y)
{register int r=1;while (y){if (y&1) r=(ll)r*x%p;x=(ll)x*x%p;y>>=1;}return r;
}
void calmatrix(int a[N][N],register int n)
{register int i,j,k,r;for (i=2;i<=n;i++){for (j=i;j<=n&&!a[j][i-1];j++);if (j>n) {continue;}if (j>i){swap(a[i],a[j]);//exit(-1);for (k=1;k<=n;k++) swap(a[k][j],a[k][i]);}r=a[i][i-1];for (j=1;j<=n;j++) a[j][i]=(ll)a[j][i]*r%p;r=ksm(r,p-2);for (j=i-1;j<=n;j++) a[i][j]=(ll)a[i][j]*r%p;for (j=i+1;j<=n;j++){r=a[j][i-1];for (k=1;k<=n;k++) a[k][i]=(a[k][i]+(ll)a[k][j]*r)%p;r=p-r;for (k=i-1;k<=n;k++) a[j][k]=(a[j][k]+(ll)a[i][k]*r)%p;}}
}
void calpoly(int a[N][N],register int n,int *f)
{static int g[N][N];memset(g,0,sizeof(g));g[0][0]=1;register int i,j,k,r,rr;for (i=1;i<=n;i++){r=p-1;for (j=i;j;j--)//第 j 行选第 n 列{rr=(ll)r*a[j][i]%p;for (k=0;k<j;k++) g[i][k]=(g[i][k]+(ll)rr*g[j-1][k])%p;r=(ll)r*a[j][j-1]%p;}for (k=1;k<=i;k++) inc(g[i][k],g[i-1][k-1]);}memcpy(f,g[n],n+1<<2);
//  if (n&1) for (i=0;i<=n;i++) if (f[i]) f[i]=p-f[i];//这题特殊(A-kE),否则注释掉
}
int main()
{read(n);//read(q);for (i=1;i<=n;i++) for (j=1;j<=n;j++) read(a[i][j]);calmatrix(a,n);calpoly(a,n,f);for (i=0;i<=n;i++) printf("%d%c",f[i]," \n"[i==n]);
}

P7776 【模板】特征多项式 题解相关推荐

  1. 解题报告(一)快速沃尔什变换FWT(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  2. 凸包 初学 Andrew 和 Melkman (模板) 旋转卡(qia)壳(ke)

    凸包初学 定义: 给你n个散落的点,让你求出最小的凸多边形将所有的点包括起来,或者点在边上. 稳定凸包,不能再扩充,每条边都用3个点 必备知识: 会用叉积判断点与直线的关系(这里指 点在线的那一边, ...

  3. 网络流入门——算法模板,习题和解析

    最近一段时间再搞网络流,今天终于搞完了!!!!QAQ,好累呀. 首先是关于网络流的基础知识,这部分东西有点多,就不在这里说了,给几个有用的资源. 先推荐一下建图的博客:链式向前星,静态链表和邻接矩阵建 ...

  4. POJ - Til the Cows Come Home(Dijkstra)

    题意: 有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 分析: 典型的模板题,但是一定要注意有重边,因此需要对输入数据加以判断,保存较短的边,这样才能正确使用模板. ...

  5. KMP Trie 例题讲解

    文章目录 HDU 4763 Theme Section 题意: 题解: 代码: POJ 3630 Phone List 题意: 题解: 代码: HDU 3746 Cyclic Nacklace 题意: ...

  6. 高斯消元法小总结和瞎总结

    啊 搞到这个算法 ,大概已经在一周前了 ,一周前做去年西安邀请赛的题,其中有一题是要用到高斯消元法求系数,然后再用矩阵快速幂求正解 ,队里ZK命自认要学数学的我 两天搞清楚那个题..然后我就从高斯消元 ...

  7. 字节大老耗时5年总结的算法刷题笔记(全彩漫画版)

    前言 王国维先生在<人间词话>中写道:古今之成大事业.大学问者,必经过三种境界:"昨夜西风凋碧树.独上高楼,望尽天涯路."此第一境也."衣带渐宽终不悔,为伊消 ...

  8. YZOI 队员论文精选

    珂学的小萌新 题解 P1196 [NOI2002] 银河英雄传说 各种提高+的题目题解(包括省选题),看得懂的大佬自行移步前往,可以照单刷题 Akito_zhima 乘法逆元模板 Tarjan缩点+拓 ...

  9. tarjan缩点并找入度为0的新点

    https://vjudge.net/contest/383000#problem/C 参考tarjan模板 参考题解 #include<stdio.h> #include<stdl ...

最新文章

  1. hadoop HA集群搭建(亲测)
  2. 在 k8s 中使用 Kubevirt 运行管理 Windows 10 操作系统
  3. 常用的方法论-鱼骨图
  4. maven web项目不能创建src/main/java等文件夹的问题
  5. servlet-新建maven报错:web.xml is missing and <failOnMissingWebXml> is set to true
  6. 关于CMMI和PMBOK之间的关系和区别比较
  7. 【英语学习】【English L06】U01 Breakfast L2 A large breakfast
  8. 阿里巴巴招募鉴黄体验官,日薪1000元,小姐姐优先,要求阅“片”无数
  9. Android立刻终止一个线程
  10. 三阶段提交(Three-phase commit)
  11. IntelliJ IDEA激活破解有效方法
  12. Check Point截获JavaScript文件隐形攻击
  13. 电视盒子为啥不安装鸿蒙,电视盒子视频播放不了怎么办?只需三步轻松解决!...
  14. ​什么是bug?bug的源头在哪里?
  15. CSR867x — sink工程的编译与下载(run)
  16. X79主板win10启动卡住问题修复处理
  17. SolidWorks装配体及约束快速导入Adams
  18. Fabric v2.2源码分析 Raft共识与排序(三)
  19. 科普 | 四大显示器接口,你真的懂吗?
  20. linux认证和红帽认证,linux认证之红帽认证:RedHatLinux新手入门(5

热门文章

  1. 使用Cydia能干什么
  2. alternate端口什么意思_alternate是什么意思
  3. 基于PHP的学生管理系统设计与实现
  4. npm WARN tarball tarball data for xxxx@^0.25... npm项目依赖安装卡住,报错,尝试多次无果的解决方法
  5. IAR获取固件编译的时间
  6. Android中的加密方法
  7. linux环境变量设置图解,Ubuntu Linux 各个环境变量配置文件详解, 环境变量PATH设置...
  8. 竞业协议“下沉”,普通程序员逃不过的坑
  9. 牛B的人到处都是(打击的一沓糊涂)
  10. 在当当和亚马逊中搜书并输出最低价格