結果
| 問題 | No.3501 Digit Products 2 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-18 01:25:35 |
| 言語 | C (gcc 15.2.0) |
| 結果 |
AC
|
| 実行時間 | 21 ms / 2,000 ms |
| コード長 | 2,371 bytes |
| 記録 | |
| コンパイル時間 | 1,484 ms |
| コンパイル使用メモリ | 38,272 KB |
| 実行使用メモリ | 30,320 KB |
| 平均クエリ数 | 10.89 |
| 最終ジャッジ日時 | 2026-04-18 01:25:45 |
| 合計ジャッジ時間 | 5,914 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge1_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 72 |
ソースコード
#include <stdio.h>
#include <stdlib.h>
#define MAXN 55
long long ask(int a, int b) {
printf("? %d %d\n", a, b);
fflush(stdout);
long long p;
if (scanf("%lld", &p) != 1) exit(0);
if (p == -1) exit(0);
return p;
}
int main(void) {
int N;
if (scanf("%d", &N) != 1) return 0;
long long q[MAXN];
int pos[MAXN];
int cntPos = 0;
// 1) query all products with the most significant digit
for (int i = 0; i <= N - 2; i++) {
q[i] = ask(i, N - 1);
if (q[i] > 0) pos[cntPos++] = i;
}
int d[MAXN] = {0};
if (cntPos >= 2) {
// 2) ask one more question between two positive digits
int i = pos[0];
int j = pos[1];
long long r = ask(i, j); // r = d_i * d_j
long long val = (q[i] * q[j]) / r; // = L^2
int L = -1;
for (int x = 1; x <= 9; x++) {
if (1LL * x * x == val) {
L = x;
break;
}
}
if (L == -1) {
printf("! -1\n");
fflush(stdout);
return 0;
}
d[N - 1] = L;
for (int k = 0; k <= N - 2; k++) {
d[k] = (int)(q[k] / L);
}
printf("! ");
for (int k = N - 1; k >= 0; k--) {
printf("%d", d[k]);
}
printf("\n");
fflush(stdout);
return 0;
}
if (cntPos == 0) {
// only the most significant digit is non-zero, impossible to determine
printf("! -1\n");
fflush(stdout);
return 0;
}
// cntPos == 1
{
int idx = pos[0];
long long prod = q[idx];
int candL = -1, candD = -1;
int ways = 0;
for (int L = 1; L <= 9; L++) {
if (prod % L != 0) continue;
long long other = prod / L;
if (1 <= other && other <= 9) {
ways++;
candL = L;
candD = (int)other;
}
}
if (ways != 1) {
printf("! -1\n");
fflush(stdout);
return 0;
}
for (int k = 0; k < N; k++) d[k] = 0;
d[N - 1] = candL;
d[idx] = candD;
printf("! ");
for (int k = N - 1; k >= 0; k--) {
printf("%d", d[k]);
}
printf("\n");
fflush(stdout);
}
return 0;
}