結果

問題 No.3501 Digit Products 2
コンテスト
ユーザー はじっこゆーれー
提出日時 2026-04-18 00:01:39
言語 Python3
(3.14.3 + numpy 2.4.4 + scipy 1.17.1)
コンパイル:
python3 -mpy_compile _filename_
実行:
python3 _filename_
結果
AC  
実行時間 200 ms / 2,000 ms
コード長 2,656 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 570 ms
コンパイル使用メモリ 20,828 KB
実行使用メモリ 35,340 KB
平均クエリ数 10.47
最終ジャッジ日時 2026-04-18 00:02:02
合計ジャッジ時間 22,486 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 72
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import sys

def solve():
    input = sys.stdin.readline
    line = input().strip()
    if not line:
        return
    N = int(line)

    P = [0] * (N - 1)
    for i in range(N - 1):
        sys.stdout.write(f"? {i} {N - 1}\n")
        sys.stdout.flush()
        res = int(input().strip())
        if res == -1:
            return
        P[i] = res

    non_zeros = [i for i, p in enumerate(P) if p != 0]

    if len(non_zeros) == 0:
        sys.stdout.write("! -1\n")
        sys.stdout.flush()
    elif len(non_zeros) == 1:
        k = non_zeros[0]
        p = P[k]
        candidates = []
        for d in range(1, 10):
            if p % d == 0 and p // d <= 9:
                candidates.append(d)
        if len(candidates) == 1:
            d = candidates[0]
            ans_digits = [0] * N
            ans_digits[N - 1] = d
            ans_digits[k] = p // d
            ans_str = "".join(str(ans_digits[i]) for i in range(N - 1, -1, -1))
            sys.stdout.write(f"! {ans_str}\n")
            sys.stdout.flush()
        else:
            sys.stdout.write("! -1\n")
            sys.stdout.flush()
    else:
        S = []
        for d in range(1, 10):
            valid = True
            for p in P:
                if p % d != 0 or p // d > 9:
                    valid = False
                    break
            if valid:
                S.append(d)
        
        if len(S) == 1:
            d = S[0]
            ans_digits = [0] * N
            ans_digits[N - 1] = d
            for i in range(N - 1):
                ans_digits[i] = P[i] // d
            ans_str = "".join(str(ans_digits[i]) for i in range(N - 1, -1, -1))
            sys.stdout.write(f"! {ans_str}\n")
            sys.stdout.flush()
        else:
            u = non_zeros[0]
            v = non_zeros[1]
            sys.stdout.write(f"? {u} {v}\n")
            sys.stdout.flush()
            ans = int(input().strip())
            if ans == -1:
                return
            
            found_d = -1
            for d in S:
                if (P[u] // d) * (P[v] // d) == ans:
                    found_d = d
                    break
            
            if found_d != -1:
                ans_digits = [0] * N
                ans_digits[N - 1] = found_d
                for i in range(N - 1):
                    ans_digits[i] = P[i] // found_d
                ans_str = "".join(str(ans_digits[i]) for i in range(N - 1, -1, -1))
                sys.stdout.write(f"! {ans_str}\n")
                sys.stdout.flush()
            else:
                sys.stdout.write("! -1\n")
                sys.stdout.flush()

if __name__ == '__main__':
    solve()
0