問題
リンク
長さNの整数列AとKが与えられるので、以下の式ををmod 998で求めて下さい。
1≤l≤r≤N∑(l≤i≤r∑Ai)K
解法
とりあえず与えられた式を理解しやすいように書き換えると、
l=1∑Nr=l∑
という3重シグマの形になる。が、一番内側のシグマについては区間和を表しているので、累積和を用いることで容易に外せる。数列SをS0=0, Sとすると、
l=1∑Nr=l∑
となる。どう考えてもK乗の部分が厄介なので、二項展開1を用いてこれを外すと、以下のようになる。
l=1∑Nr
3重シグマとなったが、これらを交換しても答えは変わらない。また、シグマから外側に出せるものは出してしまうことにする。これらを適用すると、式は以下のように変形できる。
p=1∑K(p
ここで、∑r=lNSrK−はの累積和を前計算しておくことによって、各に対してで計算ができる。よって全体でで解くことが可能で、この問題の制約下では十分高速になる。
提出
提出(C++23, 45ms)
using mint = modint998244353;
mint ncr(int n, int r) {
mint res = 1;
rep(i,r) {
res *= (n-i)