AtCoder Beginner Contest 422 D

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)
}