2021年10月9日土曜日

エクサウィザーズプログラミングコンテスト2021 (ABC 222) G - 222

与えられた数列を(ai)i=0 (a0=0,a1=2,a2=22,...)(a_i)_{i = 0}^\infty \ (a_0=0, a_1 = 2, a_2 = 22, ...)とする。M=[10201],v=[01]M = \begin{bmatrix} 10 & 2 \\ 0 & 1\end{bmatrix}, v= \begin{bmatrix} 0 \\ 1\end{bmatrix}とするとき、aka_kMkvM^k vの第一成分に等しい。従って、問題はv=Mkvv = M^kvであるような最小の正整数kkを求めることと言い換えられる。

この問題はbaby-step giant-stepで解ける。B=KB= \lceil \sqrt K \rceilとする。a0,a1,a2,...,aB1a_0, a_1, a_2, ..., a_{B-1}についてmod  K\mod Kでの値をmapのキー、添字をmapの値として保持しておく。(キーが重複する場合、そこでサイクルに入るので、それまでに00が見つかっていなければ打ち切ってよい。) k=iBjk= iB-j, j{0,1,...,B1}j \in \{0, 1, ..., B-1\}とする時、v=Mkvv = M^kvが成り立つためにはMjv=MiHvM^j v = M^{iH}vが成り立つ必要がある。したがって、i=1,2,...,Bi=1, 2, ..., BについてMiBvM^{iB}vを計算してaiBa_{iB}を求め。この値が先に作ったマップに入っていれば対応する添字jjを取り出すとk=iBjk=iB-jが答えの候補になる。ただし、MMは正則とは限らないので、Mjv=MiBvM^j v = M^{iB}vは必要条件でしかない。つまり、aiBjmod  Ka_{iB-j} \mod Kが必ず00になるわけではない。実際にMiBjvM^{iB-j}vを計算して確認する必要がある。

ハッシュテーブルを使った場合の期待計算量はO(K){O}(\sqrt K)