結果
| 問題 | No.3501 Digit Products 2 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-18 20:15:49 |
| 言語 | Python3 (3.14.3 + numpy 2.4.4 + scipy 1.17.1) |
| 結果 |
AC
|
| 実行時間 | 116 ms / 2,000 ms |
| コード長 | 1,796 bytes |
| 記録 | |
| コンパイル時間 | 367 ms |
| コンパイル使用メモリ | 20,700 KB |
| 実行使用メモリ | 35,464 KB |
| 平均クエリ数 | 10.89 |
| 最終ジャッジ日時 | 2026-04-18 20:16:04 |
| 合計ジャッジ時間 | 11,767 ms |
|
ジャッジサーバーID (参考情報) |
judge3_1 / judge2_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 72 |
ソースコード
import sys
import math
def solve():
input = sys.stdin.readline
N = int(input())
L = N - 1 # leading digit position (10^L place), always nonzero
# Phase 1: Query (j, L) for all j < L → get d[j]*d[L]
products = {}
for j in range(L):
print(f"? {j} {L}", flush=True)
p = int(input())
if p == -1:
return
products[j] = p
nonzero = [j for j in range(L) if products[j] > 0]
# Case: no non-zero non-leading digits → leading digit unknown
if len(nonzero) == 0:
print("! -1", flush=True)
return
# Case: exactly one non-zero → only one query result, may be ambiguous
if len(nonzero) == 1:
j1 = nonzero[0]
p1 = products[j1] # = d[j1] * d[L]
solutions = [(a, p1//a) for a in range(1,10)
if p1 % a == 0 and 1 <= p1//a <= 9]
if len(solutions) == 1:
dj1, dL = solutions[0]
digits = [0] * N
digits[L] = dL
digits[j1] = dj1
X = sum(digits[i] * (10**i) for i in range(N))
print(f"! {X}", flush=True)
else:
print("! -1", flush=True)
return
# Case: 2+ non-zero positions → can determine d[L] exactly
j1, j2 = nonzero[0], nonzero[1]
print(f"? {j1} {j2}", flush=True) # = d[j1]*d[j2]
q12 = int(input())
if q12 == -1:
return
# d[L]^2 = (d[j1]*d[L]) * (d[j2]*d[L]) / (d[j1]*d[j2])
dL_sq = products[j1] * products[j2] // q12
dL = round(math.isqrt(dL_sq))
digits = [0] * N
digits[L] = dL
for j in range(L):
digits[j] = products[j] // dL if products[j] > 0 else 0
X = sum(digits[i] * (10**i) for i in range(N))
print(f"! {X}", flush=True)
solve()