結果
| 問題 |
No.3316 Make 81181819 with only 0,1,or 8
|
| コンテスト | |
| ユーザー |
urectanc
|
| 提出日時 | 2025-10-31 23:33:04 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 19 ms / 6,000 ms |
| コード長 | 2,378 bytes |
| コンパイル時間 | 12,928 ms |
| コンパイル使用メモリ | 401,660 KB |
| 実行使用メモリ | 7,720 KB |
| 最終ジャッジ日時 | 2025-10-31 23:33:21 |
| 合計ジャッジ時間 | 14,619 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 22 |
ソースコード
use proconio::input;
const N: usize = 81181819;
const K: usize = 9;
const M: usize = 8 * K;
fn main() {
let solver = Solver::new();
input! { t: usize }
for _ in 0..t {
input! { n: usize }
let ans = solver.solve(N - n);
println!("{}", ans.len());
println!(
"{}",
ans.iter()
.map(ToString::to_string)
.collect::<Vec<_>>()
.join("\n")
);
}
}
struct Solver {
table: Vec<Option<Vec<usize>>>,
}
impl Solver {
fn new() -> Self {
let mut table = vec![None; M + 1];
table[0] = Some(vec![]);
for i in 1..=M {
for d in [8, 1] {
if i >= d {
if let Some(v) = &table[i - d] {
if v.len() >= K {
continue;
}
let mut v = v.clone();
v.push(d);
table[i] = Some(v);
break;
}
}
}
}
Self { table }
}
fn solve(&self, n: usize) -> Vec<usize> {
for k in 1..10 {
let ans = self.search(n, k);
if let Some(ans) = ans {
return ans;
}
}
unreachable!()
}
fn search(&self, n: usize, k: usize) -> Option<Vec<usize>> {
for (i, v) in self.table.iter().enumerate() {
if n < i {
break;
}
if let Some(v) = v {
if v.len() > k {
continue;
}
if i == n {
assert!(v.len() <= k);
let mut v = v.clone();
v.resize(k, 0);
return Some(v);
}
if (n - i) % 10 == 0 {
if let Some(mut w) = self.search((n - i) / 10, k) {
assert_eq!(w.len(), k);
for a in &mut w {
*a *= 10;
}
for (a, b) in w.iter_mut().zip(v) {
*a += b;
}
return Some(w);
}
}
}
}
None
}
}
urectanc