行列 M の i 行 j 列成分を Mi,j と表記します。
A:=u⊤v と置くと、Ai,j=uivj であるため
(A2)i,j=k=1∑nAi,kAk,j=k=1∑n(uivk)(ukvj)=(k=1∑nukvk)uivj=(u⋅v)Ai,j
が成り立ちます。
このように行列 A に対して A を掛けることはスカラー (u⋅v) 倍することと等しいので、Ak=(u⋅v)k−1A となります。
以下、場合分けして考えます。
1. k=1 の場合
上記の内容とは関係無く、単に行列 u⊤v に含まれる 0 の数を求める問題となります。九九表のような表の中にいくつ 0 があるかを数えることをイメージすると良いです。
u,v の成分のうち 0 であるものの個数をそれぞれ u0,v0 と置きます。「九九」の「0 の段」に表れる要素は全て 0 となるので、重複を含めてそれらを数えた後に数えすぎた部分を引くことを考えると、答えは (u0×n+v0×n−u0×v0) となります。
2. k=1 かつ u⋅v=0 の場合
行列 A は何乗しても(非零の)定数倍されるだけなので、Ak に含まれる 0 の個数と A に含まれる 0 の個数は等しいです。そのため、k=1 として考えればよいです。
3. k=1 かつ u⋅v=0 の場合
Ak=(u⋅v)k−1A=0A より、Ak は零行列です。よって答えは n2 です。
解答例 (C++)
解答例 (Python 3)