Description
给定矩阵 aaa。
定义一次变换如下: 对于每一个 ai,ja_{i,j}ai,j,同时将其变为
∑k=1nai,k+∑k=1nak,j\sum_{k=1}^n a_{i,k}+\sum_{k=1}^n a_{k,j}k=1∑nai,k+k=1∑nak,j
求变换 ttt 次后,aaa 的每一位是多少。
1≤n≤1000,0≤t≤1091 \le n \le 1000,0 \le t \le 10^91≤n≤1000,0≤t≤109
Solution
我们构造一个 n×nn \times nn×n 矩阵 GGG,其每一位都是 111。令 ArA^{r}Ar 表示对 AAA 进行行变换(即 ∀ai,j\forall a_{i,j}∀ai,j,将其变为第 iii 行所有数的和),AcA^{c}Ac 表示对 AAA 进行列变换(即 ∀ai,j\forall a_{i,j}∀ai,j,将其变为第 jjj 列所有数的和),则有
Ar=AGAc=GAA^{r}=AG \\ A^{c}=GAAr=AGAc=GA
令 A′A'A′ 表示对 AAA 进行变换,则
A′=AG+GAA'=AG+GAA′=AG+GA
从而
A′′=AG2+2GAG+G2AA''=AG^2+2GAG+G^2AA′′=AG2+2GAG+G2A
更进一步的
A(k)=∑i=0k(ki)GiAGk−iA^{(k)}=\sum_{i=0}^k {k \choose i} G^i A G^{k-i}A(k)=i=0∑k(ik)GiAGk−i
我们考虑 GxAGk−xG^x A G^{k-x}GxAGk−x 是什么。首先,不难发现 GxG^xGx 是一个满足 ∀Gi,j=nx−1\forall G_{i,j}=n^{x-1}∀Gi,j=nx−1 的矩阵,从而
(GxA)i,j=∑w=1nnxAw,j=nx∑w=1nAw,j\left(G^x A\right)_{i,j}=\sum_{w=1}^n n^x A_{w,j}=n^x \sum_{w=1}^n A_{w,j}(GxA)i,j=w=1∑nnxAw,j=nxw=1∑nAw,j
从而
(GxAGk−x)i,j=∑w=1n(GxA)i,wGw,jk−x=∑w=1nnk−x−1nx−1∑p=1nAp,w=nk−2∑w=1n∑p=1nAp,w=nk−2×Sum(A)\begin{aligned} \left(G^x A G^{k-x} \right)_{i,j} &=\sum_{w=1}^n (G^x A)_{i,w} G^{k-x}_{w,j} \\ &= \sum_{w=1}^n n^{k-x-1} n^{x-1} \sum_{p=1}^n A_{p,w} \\ &=n^{k-2} \sum_{w=1}^n \sum_{p=1}^n A_{p,w} \\ &= n^{k-2} \times Sum(A)\end{aligned}(GxAGk−x)i,j=w=1∑n(GxA)i,wGw,jk−x=w=1∑nnk−x−1nx−1p=1∑nAp,w=nk−2w=1∑np=1∑nAp,w=nk−2×Sum(A)
不过这个结论似乎在 x=0x=0x=0 与 x=kx=kx=k 的时候并不正确。于是保留这两项,得到最终的答案
(nk−2Sum(A)∑i=1k−1(ki))+GkA+AGk\left(n^{k-2} Sum(A)\sum_{i=1}^{k-1} {k \choose i} \right)+G^kA+AG^k(nk−2Sum(A)i=1∑k−1(ik))+GkA+AGk
GkAG^kAGkA 与 AGkAG^kAGk 都可以快速计算。同时
∑i=1k−1(ki)=2k−2\sum_{i=1}^{k-1} {k \choose i}=2^k-2i=1∑k−1(ik)=2k−2
总复杂度 O(n2+logk)O(n^2+\log k)O(n2+logk),代码不到 303030 行。场上人均爆切,不过菜鸡 ducati\color {grey} \text{ducati}ducati 在赛后思考了好长时间也没有想到第一步,实在令人唏嘘。

本文介绍了一种计算n×n矩阵经过特定变换t次后的元素值的方法,利用递推公式和矩阵乘法技巧,实现复杂度为O(n²+logk)的解决方案,适合大规模矩阵操作。
1258

被折叠的 条评论
为什么被折叠?



