https://atcoder.jp/contests/abc422/tasks/abc422_d
半分にしてなるべく同じになるように分配する、という処理を繰り返します。
// Least Unbalanced #![allow(non_snake_case)] //////////////////// library //////////////////// fn read<T: std::str::FromStr>() -> T { let mut line = String::new(); std::io::stdin().read_line(&mut line).ok(); line.trim().parse().ok().unwrap() } fn read_vec<T: std::str::FromStr>() -> Vec<T> { read::<String>().split_whitespace() .map(|e| e.parse().ok().unwrap()).collect() } //////////////////// process //////////////////// fn read_input() -> (usize, i32) { let v: Vec<usize> = read_vec(); (v[0], v[1] as i32) } fn F_each(N: usize, offs: usize, K: i32) -> Vec<i32> { if N == 0 { vec![K] } else { let v = F_each(N-1, offs, (K+1)/2); let w = F_each(N-1, offs+(1<<(N-1)), K/2); [v.as_slice(), w.as_slice()].concat() } } fn F(N: usize, K: i32) { let B = F_each(N, 0, K); println!("{}", if K % (1 << N) == 0 { 0 } else { 1 }); println!("{}", B.iter().map(|e| e.to_string()).collect::<Vec<_>>().join(" ")) } fn main() { let (N, K) = read_input(); F(N, K) }