難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) 未投票 (0票)

投票の分布

まだ投票はありません。

  1. Lv.10票
  2. Lv.20票
  3. Lv.30票
  4. Lv.40票
  5. Lv.50票
  6. Lv.60票
  7. Lv.70票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

Concat Coprimes

作成者 loop0919

難易度(作成者設定) Lv.4

難易度(投票) 未投票 (0票)

実行時間制限
2 秒
メモリ制限
512 MiB

解説

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

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

証明

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

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

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

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

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

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

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

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

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())

ユーザー解説

ユーザー解説を書く