行列 MMiijj 列成分を Mi,jM_{i, j} と表記します。

AuvA \coloneqq \vec{u}^\top \vec{v} と置くと、Ai,j=uivjA_{i, j} = u_i v_j であるため

(A2)i,j=k=1nAi,kAk,j=k=1n(uivk)(ukvj)=(k=1nukvk)uivj=(uv)Ai,j(A^2)_{i, j} = \displaystyle\sum_{k = 1}^n A_{i, k} A_{k, j} = \displaystyle\sum_{k = 1}^n (u_i v_k) (u_k v_j) = \left(\displaystyle\sum_{k = 1}^n u_k v_k \right) u_i v_j = (\vec{u} \cdot \vec{v}) A_{i, j}

が成り立ちます。

このように行列 AA に対して AA を掛けることはスカラー (uv)(\vec{u} \cdot \vec{v}) 倍することと等しいので、Ak=(uv)k1AA^k = (\vec{u} \cdot \vec{v})^{k - 1} A となります。

以下、場合分けして考えます。

1.  k=1 \ k = 1 \ の場合

上記の内容とは関係無く、単に行列 uv\vec{u}^\top \vec{v} に含まれる 00 の数を求める問題となります。九九表のような表の中にいくつ 00 があるかを数えることをイメージすると良いです。

u,v\vec{u}, \, \vec{v} の成分のうち 00 であるものの個数をそれぞれ u0,v0u_0, \, v_0 と置きます。「九九」の「00 の段」に表れる要素は全て 00 となるので、重複を含めてそれらを数えた後に数えすぎた部分を引くことを考えると、答えは (u0×n+v0×nu0×v0)(u_0 \times n + v_0 \times n - u_0 \times v_0) となります。

2.  k1 \ k \neq 1 \ かつ  uv0 \ \vec{u} \cdot \vec{v} \neq 0 \ の場合

行列 AA は何乗しても(非零の)定数倍されるだけなので、AkA^k に含まれる 00 の個数と AA に含まれる 00 の個数は等しいです。そのため、k=1k = 1 として考えればよいです。

3.  k1 \ k \neq 1 \ かつ  uv=0 \ \vec{u} \cdot \vec{v} = 0 \ の場合

Ak=(uv)k1A=0AA^k = (\vec{u} \cdot \vec{v})^{k - 1} A = 0 A より、AkA^k は零行列です。よって答えは n2n^2 です。


解答例 (C++)

解答例 (Python 3)