解説

この問題を愚直に解こうとすると

  • (X1,X2)(X_1, X_2) の選び方: S1S - 1 通り
  • ii1122 から選ぶ操作を NN 回: 2N2^N 通り

O(S2N)O(S2^N) 通りを試す必要があります。

実行時間制限の 22 秒では 10910^9 回程度の演算しかできないため、S×2N1018×2141022S\times2^N \approx 10^{18}\times2^{14} \approx 10^{22} 回の演算は TLE となります。

そのため、工夫して時間計算量を削減しましょう。

操作順を変える

具体例として入力例 11 の操作列を考えます。

(3,5)i=1(10,5)i=2(10,16)i=1(5,16)(3, 5) \xrightarrow{i = 1} (10, 5) \xrightarrow{i = 2} (10, 16) \xrightarrow{i = 1} (5, 16)

i=1i = 1 を選んだ操作と i=2i = 2 を選んだ操作は独立です。つまり、i=1i = 1 を選んだ操作と i=2i = 2 を選んだ操作の順番を入れ替えても最終的な値は変わりません。

よって、入力例 11 の操作列は次のように並び替えられます。

(3,5)i=1(10,5)i=1(5,5)i=2(5,16)(3, 5) \xrightarrow{i = 1} (10, 5) \xrightarrow{i = 1} (5, 5) \xrightarrow{i = 2} (5, 16)

なので、i=1i = 1 を選んだ操作をしたあとに i=2i = 2 を選んだ操作をするとして良いです。

逆操作を考える

さらに計算量を削減するため、入力で与えられる (Y1,Y2)(Y_1, Y_2) から X1+X2=SX_1 + X_2 = S となるような (X1,X2)(X_1, X_2) を探す方法を考えます。

整数 AA に対して整数 BB を次のように定義します。

  • AA が偶数なら B=A2B = \dfrac{A}{2}
  • AA が奇数なら B=3A+1B = 3A + 1

この BBA=XiA = X_i のときに、操作手順 22 を行った後の XiX_i の値です。

AABB を用いて表します。

  • A=2BA = 2B
  • A=(B1)/3A = (B - 1) / 3
    • (B1)(B - 1)33 で割り切れる
    • (B1)/3(B - 1) / 3 が奇数

よって BB となりうるのは A=2BA = 2BA=(B1)/3A = (B - 1) / 3 に限られることがわかります。

したがって、(Y1,Y2)(Y_1, Y_2) から逆操作を NN 回繰り返して、X1+X2=SX_1 + X_2 = S となるような (X1,X2)(X_1, X_2) のペアがあるかを調べれば良いです。

実装方法

以上の考察を元にすると、

  • A=2BA = 2BA=(B1)/3A = (B - 1) / 3 をどちらに行うのかの 2N2^N 通り
  • 逆操作を Y1Y_1 に何度行うのかの N+1N + 1 通り

の計 O(N2N)O(N2^N) 通りについて、それぞれ NN 回の逆操作を実際に行って X1+X2=SX_1 + X_2 = S となるかを判定することにより、O(N22N)O(N^22^N) で解くことができます。

これは再帰関数や bit 全探索によって実装できます。

実装例

再帰関数を用いた実装例 (C)

再帰関数を用いた実装例 (C++)

再帰関数を用いた実装例 (Python)

bit 全探索を用いた実装例 (C)

bit 全探索を用いた実装例 (C++)

bit 全探索を用いた実装例 (Python)