解説
が の倍数のとき、 が必ず の倍数となってしまい と が必ず公約数 を持ちます。
同様に が の倍数のときも と が必ず公約数 を持ちます。
よって、 が の倍数または の倍数のときは、条件を満たす は存在しません。
逆に、それ以外の場合は が存在します。
証明
と は必ず互いに素なので、 と固定すると が解の候補となります。
ここで、仮定より は と互いに素であることが言えます。
よって なる は必ず存在し、 と置くと なる も存在します。
したがって が存在し、これは の倍数です。
さて、ここで得られた は 以下です。 としても上記の証明が成立し、 が成り立つためです。
よって、解が存在する場合は以下のアルゴリズムで十分高速に解くことができます。
- の倍数 を昇順に判定していき、 が条件を満たすならばそれを答えとする。
判定時、 が leading-zero であるときは の定義を満たしていないため条件を満たさないことに注意してください。
判定部分が 、探索範囲が 個であるため、全体の計算量 で解くことができます。
from math import gcd
def is_valid(X: int, N: int) -> bool:
str_x = str(X)
for i in range(1, len(str_x)):
a = str_x[:i]
b = str_x[i:]
if b[0] == "0":
continue
if gcd(int(a), N) == 1 and gcd(int(b), N) == 1:
return True
return False
def solve() -> int:
N = int(input())
if N % 2 == 0 or N % 5 == 0:
return -1
X = N
while not is_valid(X, N):
X += N
return X
if __name__ == "__main__":
T = int(input())
for _ in range(T):
print(solve())