結果
| 問題 | No.262 面白くないビットすごろく |
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2026-05-09 19:59:40 |
| 言語 | Rust (1.94.0 + proconio + num + itertools) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 2,000 ms |
| コード長 | 1,193 bytes |
| 記録 | |
| コンパイル時間 | 5,127 ms |
| コンパイル使用メモリ | 196,524 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-05-09 19:59:52 |
| 合計ジャッジ時間 | 6,137 ms |
|
ジャッジサーバーID (参考情報) |
judge3_1 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 4 |
ソースコード
fn main() {
proconio::input!(n: usize);
let mut x = 1usize;
let mut cnt = 1;
let mut map = Map::new();
for i in (0..40).rev() {
if n >> i & 1 == 1 && x >> i & 1 == 0 {
let b = (x >> i).count_ones() as usize;
let c = x & ((1 << i) - 1);
let p = dfs(i, b, c, &mut map);
x += p.1;
cnt += p.0;
}
}
if x == n {
println!("{cnt}");
} else {
println!("-1");
}
}
type Map<K, V> = std::collections::HashMap<K, V>;
// 2^a まで決めた、暫定桁和b, +c して始める、2^aに寄与発生するまでに足す回数、足される値
fn dfs(
a: usize,
b: usize,
c: usize,
map: &mut Map<(usize, usize, usize), (usize, usize)>,
) -> (usize, usize) {
assert!(b + c > 0);
if c >= 1 << a {
return (0, 0);
}
if a == 0 {
return (1, b);
}
if let Some(&v) = map.get(&(a, b, c)) {
return v;
}
let mut p = dfs(a - 1, b, c, map);
if c + p.1 < (1 << a) {
let q = dfs(a - 1, b + 1, c + p.1 - (1 << (a - 1)), map);
p.0 += q.0;
p.1 += q.1;
}
map.insert((a, b, c), p);
p
}
akakimidori