結果

問題 No.3501 Digit Products 2
コンテスト
ユーザー 왕지후
提出日時 2026-04-18 01:25:35
言語 C
(gcc 15.2.0)
コンパイル:
gcc-15 -O2 -DONLINE_JUDGE -o a.out _filename_ -lm
実行:
./a.out
結果
AC  
実行時間 21 ms / 2,000 ms
コード長 2,371 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 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
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#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;
}
0