use proconio::input; fn main() { input! { n: usize, } let mut ans = 0; for i in 0..=n { for j in i..=n { // popcountが一致するかを見る let cnt1 = pop_count(i as u64); let cnt2 = pop_count(j as u64); // 一致する場合は、ANDをとる if cnt1 == cnt2 { // 取った値を加算 let val = i & j; ans += val; ans %= 998244353; } } } println!("{}", ans); } pub fn pop_count(v :u64) -> u64 { let mut count = (v & 0x5555555555555555) + ((v >> 1) & 0x5555555555555555); count = (count & 0x3333333333333333) + ((count >> 2) & 0x3333333333333333); count = (count & 0x0f0f0f0f0f0f0f0f) + ((count >> 4) & 0x0f0f0f0f0f0f0f0f); count = (count & 0x00ff00ff00ff00ff) + ((count >> 8) & 0x00ff00ff00ff00ff); count = (count & 0x0000ffff0000ffff) + ((count >> 16) & 0x0000ffff0000ffff); /*count=*/ (count & 0x00000000ffffffff) + ((count >> 32) & 0x00000000ffffffff) }