Sum of Averages (subarray)

2 secs 1024 MB
yunipoke's icon yunipoke

部分列の長さを固定してすべての部分列に渡った総和を計算し、それを長さで割ったものの和が答えとなります。するとk=1,2,,Nk = 1,2,\cdots,Nについて、AAのすべての長さkkの連続部分列の総和が列挙できればいいです。それはAAの累積和をS(0indexed)S(0-indexed)として (S[k]S[0])+(S[k+1]S[1])++(S[N]S[Nk])=i=Nk+1NS[i]i=0k1S[i](S[k] - S[0]) + (S[k + 1] - S[1]) + \cdots + (S[N] - S[N - k]) = \sum_{i=N - k + 1}^{N} S[i]\enspace- \sum_{i=0}^{k-1} S[i]とかけます。Lk=i=0k1S[i],Rk=i=Nk+1NS[i]L_k = \sum_{i=0}^{k-1} S[i],R_k = \sum_{i=N - k + 1}^{N} S[i]とするとL1=S[0],R1=S[N],Lk=Lk1+S[k1],Rk=Rk1+S[Nk+1]L_1 = S[0],R_1 = S[N],L_k = L_{k-1} + S[k - 1],R_k = R_{k-1} + S[N - k + 1]が成り立ちます。 これを用いると k=1,2,,Nk = 1,2,\cdots,Nの順にLk,RkL_k,R_kを計算しながらRkLkk\frac{R_k - L_k}{k}を足し合わせていくと答えが求まります。よってmod=998244353mod = 998244353として時間計算量O(Nlogmod)O(N\log mod)でこの問題を解くことができました。