結果

問題 No.3501 Digit Products 2
コンテスト
ユーザー tnakao0123
提出日時 2026-04-20 11:08:24
言語 C++17
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++17 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
WA  
実行時間 -
コード長 1,649 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 534 ms
コンパイル使用メモリ 69,504 KB
実行使用メモリ 30,320 KB
平均クエリ数 11.16
最終ジャッジ日時 2026-04-20 11:08:39
合計ジャッジ時間 10,198 ms
ジャッジサーバーID
(参考情報)
judge3_1 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 44 WA * 28
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

/* -*- coding: utf-8 -*-
 *
 * 3501.cc:  No.3501 Digit Products 2 - yukicoder
 */

#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

/* constant */

const int MAX_N = 51;

/* typedef */

using vi = vector<int>;

/* global variables */

int tts[81 + 1], ps[MAX_N], xs[MAX_N];

/* subroutines */

int query(int a, int b) {
  if (a > b) swap(a, b);
  printf("? %d %d\n", a, b); fflush(stdout);

  int p;
  scanf("%d", &p);
  if (p < 0) exit(0);
  return p;
}

void answer(int n, int xs[]) {
  if (n > 0) {
    printf("! ");
    for (int i = 0; i < n; i++) printf("%d", xs[i]);
    putchar('\n');
  }
  else
    puts("! -1");
  fflush(stdout);
}

/* main */

int main() {
  tts[1] = 1, tts[25] = 5, tts[49] = 7, tts[64] = 8, tts[81] = 9;
  
  int n;
  scanf("%d", &n);

  ps[0] = -1;
  vi vs(1, 0);
  for (int i = 1; i < n; i++) {
    ps[i] = query(0, i);
    if (ps[i] > 0) vs.push_back(i);
  }

  int m = vs.size();
  if (m <= 1) {
    answer(-1, xs);
  }
  else if (m == 2) {
    int p = query(vs[0], vs[1]);
    if (tts[p] > 0) {
      xs[vs[0]] = xs[vs[1]] = tts[p];
      answer(n, xs);
    }
    else
      answer(-1, xs);
  }
  else { // m >= 3
    int p1 = ps[vs[1]], p2 = ps[vs[2]];
    int p3 = query(vs[1], vs[2]);

    bool ok = false;
    for (int x0 = 1; ! ok && x0 <= 9; x0++)
      if (p1 % x0 == 0 && p2 % x0 == 0) {
	int x1 = p1 / x0, x2 = p2 / x0;
	if (x1 <= 9 && x2 <= 9 && x1 * x2 == p3) {
	  ok = true;
	  xs[vs[0]] = x0;
	  for (int i = 1; ok && i < m; i++) {
	    xs[vs[i]] = ps[vs[i]] / x0;
	    ok = (ps[vs[i]] % x0 == 0 && xs[vs[i]] <= 9);
	  }
	}
      }

    answer(n, xs);
  }
  
  return 0;
}

0