803:疑似乱数列

Rand48はいくつかのプログラミング言語で使われる疑似乱数生成器である。これは任意に与えられた整数a0a_0から数列を an=(25214903917an1+11)mod248a_n = ( 25214903917 \cdot a_{n-1} + 11 ) \bmod 2^{48}という規則に従い生成する。

bn=an/216mod52b_n = \lfloor a_n / 2^{16} \rfloor \bmod 52とする。数列 b0,b1,b_0, b_1, \dots0a,0 \to \textrm{a},1b,1 \to \textrm{b},,\dots,25z,25 \to \textrm{z},26A,26 \to \textrm{A},27B,27 \to \textrm{B},,\dots,51Z51 \to \textrm{Z}という規則を介して​無限文字列 c=c0c1c2c=c_0c_1c_2\dots に変換される。

例えば、a0=123456a_0 = \textbf{123456}と選ぶと cc の冒頭は "bQYicNGCY..." となる。 さらに、100文字めからの位置に "RxqLBfWzv" という部分文字列の最初の出現がある。

あるいは、cc の冒頭が "EULERcats..." ならば、a0=78580612777175a_0 = 78580612777175 に違いない。

今、cc が "PuzzleOne..." で始まっていると仮定する。 cc の部分列として最初に "LuckyText" が出現する位置を求めよ。

最終更新