题解-洛谷P8110 [Cnoi2021]矩阵
P8110 [Cnoi2021]矩阵
题解
-
分析
以样例\(1\)为例:
3 0 1 2 3 4 5 6
根据题意,\(A_{ij}=a_i\times b_j\),很容易得到:
\[A= \begin{bmatrix} 4&5&6\\ 8&10&12\\ 12&15&18\\ \end{bmatrix} \]诶,有没有发现一个特殊的性质?
矩阵\(A\)的行和列线性相关[1]!!!
从而,矩阵\(A\)的秩\(r(A)=1\),于是有一个结论[2]:
\[A^k=\text{tr(A)}^{k-1}A \]其中,\(\text{tr(A)}\)称为矩阵\(A\)的迹,即\(A\)的主对角线上的元素之和(在这里即\(\sum_{i=1}^{n}a_ib_i\))
那么,此题已解。
\[\begin{aligned} Ans&=\text{tr(A)}^{k-1}\sum_{i=1}^{n}\sum_{j=1}^{n}{A_{ij}} \\&=(\sum_{i=1}^{n}a_ib_i)^{k-1}\sum_{i=1}^{n}\sum_{j=1}^{n}{a_i\cdot b_j} \\&=(\sum_{i=1}^{n}a_ib_i)^{k-1}\sum_{i=1}^{n}{a_i}\sum_{j=1}^{n}{b_j} \\&=(\sum_{i=1}^{n}a_ib_i)^{k-1}(\sum_{i=1}^{n}{a_i})\cdot(\sum_{j=1}^{n}{b_j}) \end{aligned} \]快速幂处理\((\sum_{i=1}^{n}a_ib_i)^{k-1}\)即可
时间复杂度:\(O(n+\log k)\)
-
代码
#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)。
「链接:百度百科-线性相关」
简洁来说,你可以把一个矩阵看作一个变换,矩阵每一列看作一个向量,如:
\[A= \begin{bmatrix} 4&5&6\\ 8&10&12\\ 12&15&18\\ \end{bmatrix} \]可以看作\(\begin{bmatrix} 4\\8\\12 \end{bmatrix}\),\(\begin{bmatrix} 5\\10\\15 \end{bmatrix}\),\(\begin{bmatrix} 6\\12\\18 \end{bmatrix}\)这三个描述变换的向量在作用到原空间后形成的空间,由于一共有三列,故有三个坐标,这些向量位于三维空间,它们的作用可以描述为:将基向量\(\begin{bmatrix} 1\\0\\0 \end{bmatrix}\),\(\begin{bmatrix} 0\\1\\0 \end{bmatrix}\),\(\begin{bmatrix} 0\\0\\1 \end{bmatrix}\)分别移到它们所在的坐标。
观察发现,\(\begin{bmatrix} 4\\8\\12 \end{bmatrix}\),\(\begin{bmatrix} 5\\10\\15 \end{bmatrix}\),\(\begin{bmatrix} 6\\12\\18 \end{bmatrix}\)这三个向量是共线的,因此整个三维空间在被它们作用后塌缩为一条直线(一维),因此矩阵\(A\)的秩「也就是\(A\)的线性无关的列(或行)的最大数目,即\(1\)」为\(1\)。
已知一个\(n\times n\)矩阵\(A\)的秩为\(1\),则\(A\)的所有列向量/行向量线性相关,此时由于这三个向量是成比例关系的,因此可以根据矩阵乘法的定义,将\(A\)拆解为一个\(n\times1\)的矩阵\(B\)和一个\(1\times n\)的矩阵\(C\)的乘积。
以上面的矩阵\(A\)为例:
\[\begin{aligned} A&= \begin{bmatrix} 4&5&6\\ 8&10&12\\ 12&15&18\\ \end{bmatrix} \\&= \begin{bmatrix} 1\\2\\3\\ \end{bmatrix} \times \begin{bmatrix} 4&5&6\\ \end{bmatrix} \end{aligned} \]记\(B=\begin{bmatrix} 1\\2\\3\\ \end{bmatrix},C=\begin{bmatrix} 4&5&6\\ \end{bmatrix}\),则\(A=B\times C\)
因此:
\[\begin{aligned} A^n&=(B\times C)^n \\&= B\times C\times B\times C...B\times C \\&=B\times(C\times B)\times(C\times B)...\times C \\&=B\times(C\times B)^{n-1}\times C \end{aligned} \]我们知道,一个\(1\times n\)的矩阵乘一个\(n\times1\)的矩阵得到的是一个\(1\times1\)的矩阵,也就是一个数。
故:
\[\begin{aligned} C\times B&=\begin{bmatrix} 4&5&6\\ \end{bmatrix}\times\begin{bmatrix} 1\\2\\3\\ \end{bmatrix} \\&=4\times1+5\times2+6\times3 \\&=32 \end{aligned} \]我们便愉快地发现:
\[A^n=32^{n-1}\times B\times C=32^{n-1}\times A \]而\(32\)不正是矩阵\(A\)对角线的元素之和吗?
证毕。
第一次写题解,如有不足,请谅解~