解説

このゲームはなんとなくニムに近いなぁと感じると思います。よって各盤面のGrundy数を考えたいのですが、そもそも操作が出来なくなるのは XX がいくつのときか分からないのでどこから推移を始めたら良いのかわかりません。

そこで、まず操作が出来なくなる XX の値の取っ掛かりを考えます。ゲームのルールより、XX の10進法での表記に 33 を含むことができない点に着目します。 このとき、任意の非負整数 cc について K10cX=3×10c1で操作ができなくなるK \leq 10^c \Longleftrightarrow X = 3 \times 10^c -1 で操作ができなくなる が成り立ちます。なぜなら、

任意の整数 i(1iK)i(1 \leq i \leq K) に対して、 X+1=3×10cX+iX+K4×10c1=399...999X+1 = 3 \times 10^c \leq X+i \leq X+K \leq 4 \times 10^c - 1 = 399...999 となり、どのように ii を定めても 33X+iX+i が含んでしまうからです。なるべく狭い範囲で考える方が良いので、以後 ccK10cK \leq 10^c を満たす最小の整数として話を進めます。

よって、Grundy(3×10c1)=0Grundy(3 \times 10^c -1) = 0 が分かりました。よって、あとは 33 の倍数でなく、10進法での表記に 33 を含まない 3×10c13 \times 10^c -1 以下の全ての正整数 zz について Grundy(z)=0Grundy(z) = 0 となるような zz のうち、KK 以下のものを求めれば良いです。しかし、全ての zz についての Grundy(z)Grundy(z) の値を逐次調べていては到底間に合いません。

そこで、Grundy(z)=0Grundy(z) = 0 となるような zz が現れる条件を考えてみます。現時点までに見つかった Grundy(z)=0Grundy(z) = 0 となるような zz のうち最小のものを mm とおきます。このとき、 z+K<mz+K < m を満たす zz の最大値 zmaxz_{max} は 必ず Grundy(zmax)=0Grundy(z_{max}) = 0 を満たします。なぜなら、 Grundy(zmax)=Mex(Grundy(zmax+1),Grundy(zmax+2),...,Grundy(zmax+K))Grundy(z_{max}) = Mex(Grundy(z_{max}+1),Grundy(z_{max}+2), ... , Grundy(z_{max}+K)) (条件を満たす zz のみ考える) であり、Mex()Mex() の中には必ず 00 が含まれないからです。

zmaxz_{max} の値は、まず zmax=mK1z_{max} = m-K-1 とし、

  • zmaxz_{max}33 の倍数なら 1-1 する
  • zmaxz_{max} が10進法での表記に 33 を含むなら33 である一番左の桁を 22 に、その桁よりも右の桁をすべて 99 にする
  • zmaxz_{max}33 の倍数なら 1-1 する

という操作をこの順に行うことで具体的に構築できます。あとはこれを zmaxKz_{max} \leq K となるまで行い、最終的に 0<zmax0 < z_{max} であれば zmaxz_{max} の値を、そうでなければ 1-1 を出力すればよいです。

ところで、K=2K = 2のとき、3×10c1=293 \times 10^c -1 = 29 で操作ができなくなることになりますが、実際には Grundy(11)=0Grundy(11) = 0 であるため(1112,1311 \rightarrow 12,13 はどちらも不可能より) 間違った答えを出しそうです。しかし実際には正しく 22 を出力します。これは、z=29z = 29 からのGrundy数が 00 になる数の推移の中で z=11z = 11 を通過するからです。

1クエリ当たりの計算量を考えます。

Grundy(z)=0Grundy(z) = 0 となるような zz の列挙にかかる時間計算量はどれくらいでしょうか? Z=3×10c1Z = 3 \times 10^c -1 から最低でも K+1K+1ZKZ \leq K を満たすまで引き続ける回数(= Grundy(z)=0Grundy(z) = 0 となるような zz の個数)は、計算量が最悪となる K=10p1+1K = 10^{p-1}+1 とおいても 3×10p110p1+130\displaystyle \frac{3 \times 10^p-1}{10^{p-1}+1} \rightarrow 30 より、zz の列挙1回で 33 を含む場合の処理が入ったとしても、列挙全体としては O(logK)O(logK) で終わります。

よって、1クエリ当たりの計算量は K10cK \leq 10^c を満たすような ccc=0c = 0 から愚直に探索したとしても O(logK)O(logK) で済むので O(logK+logK)=O(logK)O(logK + logK) = O(logK) であり、全体の時間計算量は O(TlogK)O(TlogK) となります。制約より、これで十分間に合います。よって、この問題を解くことができました。