atcoder-solutionsatcoder-solutions
abc129_e

Sum Equals Xor の解説

abc129_e by @ohnuma

解説

古き良き桁dp。

dp[i][j] := 上からi桁目まで見た時にすでにL未満かのフラグがjの時の場合の数

としてdpすれば良い。

fn main() { input! { l: Chars } let l = l .iter() .map(|&e| if e == '1' { 1 } else { 0 }) .collect_vec(); let mut dp = vec![ModInt1000000007::new(0); 2]; dp[1] += 1usize; for &num in l.iter() { let mut ep = vec![ModInt1000000007::new(0); 2]; for j in 0..2 { let now = dp[j]; if num == 1 { ep[j] += now * 2; ep[0] += now; } else { ep[j] += now; ep[0] += if j == 1 { ModInt1000000007::new(0) } else { now * 2 }; } } swap(&mut dp, &mut ep); } println!("{}", dp[0] + dp[1]); }

コメント