結果

問題 No.3501 Digit Products 2
コンテスト
ユーザー akakimidori
提出日時 2026-04-17 21:05:16
言語 Rust
(1.94.0 + proconio + num + itertools)
コンパイル:
/usr/bin/rustc_custom
実行:
./target/release/main
結果
WA  
実行時間 -
コード長 2,263 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 3,609 ms
コンパイル使用メモリ 198,068 KB
実行使用メモリ 30,332 KB
平均クエリ数 10.45
最終ジャッジ日時 2026-04-17 21:05:45
合計ジャッジ時間 19,970 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 31 WA * 40 RE * 1
権限があれば一括ダウンロードができます
コンパイルメッセージ
warning: unused import: `std::io::Write`
 --> src/main.rs:1:5
  |
1 | use std::io::Write;
  |     ^^^^^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default

warning: type alias `Map` is never used
 --> src/main.rs:4:6
  |
4 | type Map<K, V> = BTreeMap<K, V>;
  |      ^^^
  |
  = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default

warning: type alias `Set` is never used
 --> src/main.rs:5:6
  |
5 | type Set<T> = BTreeSet<T>;
  |      ^^^

warning: type alias `Deque` is never used
 --> src/main.rs:6:6
  |
6 | type Deque<T> = VecDeque<T>;
  |      ^^^^^

ソースコード

diff #
raw source code

use std::io::Write;
use std::collections::*;

type Map<K, V> = BTreeMap<K, V>;
type Set<T> = BTreeSet<T>;
type Deque<T> = VecDeque<T>;

fn main() {
    let n = read();
    let mut memo = vec![];
    let mut g = 0;
    for i in 0..(n - 1) {
        println!("? {} {}", i, n - 1);
        let v = read();
        memo.push(v);
        g = gcd(g, v);
    }
    if g == 0 {
        println!("! -1");
        return;
    }
    let mut cond = (1..=9).filter(|k| g % k == 0 && memo.iter().all(|m| *m / *k <= 9)).collect::<Vec<_>>();
    let x = (0..memo.len()).filter(|x| memo[*x] != 0).collect::<Vec<_>>();
    if cond.len() > 1 {
        if x.len() < 2 {
            println!("! -1");
            return;
        }
        let pos = [0, x[0], x[1]];
        println!("? {} {}", x[0], x[1]);
        let v = read();
        let val = [memo[pos[0]], v, memo[pos[1]]];
        let mut ncond = vec![];
        for mut v in cond {
            let ini = v;
            let mut ok = true;
            for &val in val.iter() {
                ok &= v > 0 && val % v == 0 && val / v <= 9;
                if ok {
                    v = val / v;
                }
            }
            if v == ini {
                ncond.push(v);
            }
        }
        cond = ncond;
    }
    assert!(cond.len() == 1);
    let mut ans = vec![];
    let s = cond[0];
    ans.push(s);
    for m in memo.iter() {
        ans.push(*m / s);
    }
    use util::*;
    println!("! {}", ans.iter().join(""));
}

fn gcd(a: usize, b: usize) -> usize {
    if b == 0 {
        a
    } else {
        gcd(b, a % b)
    }
}

fn read() -> usize {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).unwrap();
    s.trim().parse().unwrap()
}
mod util {
    pub trait Join {
        fn join(self, sep: &str) -> String;
    }

    impl<T, I> Join for I
    where
        I: Iterator<Item = T>,
        T: std::fmt::Display,
    {
        fn join(self, sep: &str) -> String {
            let mut s = String::new();
            use std::fmt::*;
            for (i, v) in self.enumerate() {
                if i > 0 {
                    write!(&mut s, "{}", sep).ok();
                }
                write!(&mut s, "{}", v).ok();
            }
            s
        }
    }
}
0