解法1: ダブリング
問題文を素直に読み取り,以下のようなDを考えます.
Dl,u,v: ちょうど距離l走って,地点uからvに到着することができるか
すると,Dについて,以下の漸化式(DP)が成り立つことがわかります.(⋁は∑の+演算がOR演算になったものです.)
Dl+1,u,v=1≤w≤N⋁Dl,u,w AND Aw,v
Dの定義から,D0は単位行列なので,これでD1から順にDKを求められそうです.
上の式通りに実装した時の,DnからDn+1を求める計算量を求めてみましょう.
全2点間について,
1≤w≤N⋁Dl,u,w AND Aw,v
を求める計算量はO(N3)です.よって,DKを求める計算量はO(N3K)となります.
しかし,この問題ではKの制約が非常に大きく,この計算量では間に合いません.
ここで,任意のxについて,以下の式が成り立つことに注目します.
D2x,u,v=1≤w≤N⋁Dx,u,w AND Dx,w,v…(1)
この式から,D2xをO(N3X)で求めることができることがわかります.また,DKは,D2xをO(logK)個足し合わせることで求めることができるため,計算量はO(N3logK)となります.
このテクニックを,ダブリングといいます.
しかし,この問題の制約では,O(N3logK)≥2×109であり,まだ高速化が必要です.
ここで,(1)式を求めるのにかかる計算量をもう一度考えてみましょう.ある2点間についてこれを求める計算量はO(N)に見えますが,実際はもっと速く計算することができます.
1≤N≤50であることを思い出してください.最近の一般的なCPUでは,64個のbitの論理積は1命令で計算することができます.これを利用し,N個のbit論理積を1命令,つまりO(1)でまとめて計算することができます.また,このN個のbitを論理和(OR)した結果は,単にその論理積の結果が0か否かを確認すれば良いです.
以上の工夫により,(1)式はO(1)で計算することができるため,上記解法の計算量をO(N2logK)に落とすことが可能です.
O(N2logK)≃5×106であるため,この解法は,この問題の実行時間制限に対して十分高速です.
解法2: 行列累乗
Dl,u,v=1≤w≤N⋁Dl−1,u,w AND Aw,v
をよく見ると,行列の積の演算によく似ています.(⋁が∑だったら行列の積ですね.)
実際,({0,1},OR)は可換モノイド,({0,1},×)もモノイド,さらに({0,1},×)は({0,1},OR)の上に分配的であることから,({0,1},OR,×)は半環であるため,({0,1},OR,×)を(R,+,×)と思って行列累乗することでO(N3logK)でDK=ANを求めることができます.
行列の積,和の実装で,上と同じくbit演算による工夫を行うことでO(N2logK)で実装可能です.
※あえて解法1と解法2が別の回答かのように書きましたが,同じことをしています.