Concat Two Coprimes

2 secs 1024 MB
loop0919's icon loop0919

解説

NN22 の倍数のとき、bb が必ず 22 の倍数となってしまい NNbb が必ず公約数 22 を持ちます。
同様に NN55 の倍数のときも NNbb が必ず公約数 55 を持ちます。

よって、 NN22 の倍数または 55 の倍数のときは、条件を満たす XX は存在しません。
逆に、それ以外の場合は XX が存在します。以下、その事実を証明します。


証明

NN11 は必ず互いに素なので、 b=1b = 1 と固定すると f(a,1)=10a+1f(a, 1) = 10a + 1 が解の候補となります。
ここで、仮定より NN1010 と互いに素であることが言えます。

よって 10a1 (mod N)10a' \equiv 1 ~ (\mathrm{mod} ~ N) なる aa' は必ず存在し、a=Naa = N - a' と置くと 10(Na)110a110(N - a) \equiv 1 \Longleftrightarrow 10a \equiv -1 なる aa も存在します。

したがって f(a,1)1+10 (mod N)f(a, 1) \equiv -1 + 1 \equiv 0 ~ (\mathrm{mod} ~ N) が存在し、これは NN の倍数です。


さて、ここで得られた XX10N10N 以下です。 a<Na \lt N としても上記の証明が成立し、f(a,1)<10N+1f(a, 1) \lt 10N + 1 が成り立つためです。

よって、解が存在する場合は以下のアルゴリズムで十分高速に解くことができます。

  • NN の倍数 x=N,2N,3N,x = N, 2N, 3N, \cdots を昇順に判定していき、xx が条件を満たすならばそれを答えとする。

判定時、 bb が leading-zero であるときは ff の定義を満たしていないため条件を満たさないことに注意してください。

判定部分が O(logN)O(\log N) 、探索範囲が O(1)O(1) 個であるため、全体の計算量 O(TlogN)O(T \log N) で解くことができます。

実装例(Python3)