abc468_e
Sum of Average の解説
abc468_e by @ohnuma
解説
Akに対する寄与を考える。
Akを固定した時にここを高速に求めることを考える
ここで、以下のように定義すると
とできる。
についてはj = l - 1とすることで
とでき、
については j = k - lとすることで
とできるので、
もとの式は
とできる。
右側はkをなめると同時に計算することができるのでO(N)で解ける。
fn main() { input! { n: usize, a: [ModInt998244353; n] } let h = { let mut v = vec![]; v.push(ModInt998244353::new(0)); for num in 1..=n { v.push(ModInt998244353::new(1) / num); } PrefixSum1D::new(&v) }; let mut ans = ModInt998244353::new(0); let mut acc = ModInt998244353::new(0); for k in 0..n { acc += h.prefix_sum(n - k + 1) - h.prefix_sum(k + 1); ans += a[k] * acc; } println!("{}", ans); }