题解-洛谷P8110 [Cnoi2021]矩阵
P8110 [Cnoi2021]矩阵
题解
-
分析
以样例
为例:3 0 1 2 3 4 5 6
根据题意,
,很容易得到:诶,有没有发现一个特殊的性质?
矩阵
的行和列线性相关[1]!!!从而,矩阵
的秩 ,于是有一个结论[2]:其中,
称为矩阵 的迹,即 的主对角线上的元素之和(在这里即 )那么,此题已解。
快速幂处理
即可时间复杂度:
-
代码
#include<iostream> #include<cstdio> #define ll long long #define maxn 100010 #define P(x) ((((x)%p)+p)%p) using namespace std; ll n,k,p=998244353,a[maxn],b[maxn],ans,mula,mulb,mulab; template<typename type> inline void read(type &x) { x=0;bool flag(0);char ch=getchar(); while(!isdigit(ch)) flag^=ch=='-',ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); flag?x=-x:0; } template<typename type> inline void write(type x,bool mode) { x<0?x=-x,putchar('-'):0;static short Stack[50],top(0); do Stack[++top]=x%10,x/=10;while(x); while(top) putchar(Stack[top--]|48); mode?putchar('\n'):putchar(' '); } inline ll ksm(ll x,ll y) { ll res=1; while(y) { if(y&1) res=P(res*x); x=P(x*x); y>>=1; } return res; } signed main() { read(n),read(k); for(int i=1;i<=n;i++) read(a[i]),a[i]=P(a[i]),mula=P(mula+a[i]); for(int i=1;i<=n;i++) read(b[i]),b[i]=P(b[i]),mulb=P(mulb+b[i]),mulab=P(mulab+P(a[i]*b[i])); if(!k) {write(n,1);return 0;} ans=P(mula*mulb)*P(ksm(mulab,k-1)); write(P(ans),1); return 0; }
-
说明
在线性代数里,矢量空间的一组元素中,若没有矢量可用有限个其他矢量的线性组合所表示,则称为线性无关或线性独立(linearly independent),反之称为线性相关(linearly dependent)。
「链接:百度百科-线性相关」
简洁来说,你可以把一个矩阵看作一个变换,矩阵每一列看作一个向量,如:
可以看作
, , 这三个描述变换的向量在作用到原空间后形成的空间,由于一共有三列,故有三个坐标,这些向量位于三维空间,它们的作用可以描述为:将基向量 , , 分别移到它们所在的坐标。观察发现,
, , 这三个向量是共线的,因此整个三维空间在被它们作用后塌缩为一条直线(一维),因此矩阵 的秩「也就是 的线性无关的列(或行)的最大数目,即 」为 。已知一个
矩阵 的秩为 ,则 的所有列向量/行向量线性相关,此时由于这三个向量是成比例关系的,因此可以根据矩阵乘法的定义,将 拆解为一个 的矩阵 和一个 的矩阵 的乘积。以上面的矩阵
为例:记
,则 因此:
我们知道,一个
的矩阵乘一个 的矩阵得到的是一个 的矩阵,也就是一个数。故:
我们便愉快地发现:
而
不正是矩阵 对角线的元素之和吗?证毕。
第一次写题解,如有不足,请谅解~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现