考虑给定 a , b a,b a,b 时怎么做。显然:
a n s = ∑ i = 1 n − 1 w i ∣ ∑ j = 1 i a j − ∑ j = 1 i b j ∣ ans=\sum_{i=1}^{n-1}w_i\Bigg|\sum_{j=1}^ia_j-\sum_{j=1}^ib_j\Bigg| ans=i=1∑n−1wi j=1∑iaj−j=1∑ibj
因此,若设 c i , d i c_i,d_i ci,di 分别为 a i , b i a_i,b_i ai,bi 的前缀和,答案即为 ∑ d ∑ i = 1 n − 1 w i ∣ c i − d i ∣ \sum\limits_ d\sum\limits_{i=1}^{n-1}w_i|c_i-d_i| d∑i=1∑n−1wi∣ci−di∣。
由于 i i i 确定时, c i c_i ci 是确定的,考虑枚举 d i d_i di 并统计可能的方案数,即 ∑ i = 1 n − 1 w i ∑ d i = 0 S ∣ c i − d i ∣ × cnt ( i , d i ) \sum\limits_{i=1}^{n-1}w_i\sum\limits_{d_i=0}^S|c_i-d_i|\times \text{cnt}(i,d_i) i=1∑n−1widi=0∑S∣ci−di∣×cnt(i,di),其中 cnt ( i , d i ) \text{cnt}(i,d_i) cnt(i,di) 即为方案数。
考虑对 d d d 数列进行分析。由于 b b b 数列均为非负整数,则 d d d 数列单调不降且 d 0 = 0 , d n = S d_0=0,d_n=S d0=0,dn=S。
则 0 ≤ d 1 ≤ d 2 ≤ ⋯ ≤ d i ≤ d i + 1 ≤ ⋯ ≤ d n = S 0\le d_1\le d_2\le\cdots\le d_i\le d_{i+1}\le\cdots\le d_n=S 0≤d1≤d2≤⋯≤di≤di+1≤⋯≤dn=S,可分为 [ 1 , i ) [1,i) [1,i) 和 ( i , n ) (i,n) (i,n) 考虑,接下来以求 0 ≤ d 1 ≤ d 2 ≤ ⋯ ≤ d i 0\le d_1\le d_2\le\cdots\le d_i 0≤d1≤d2≤⋯≤di 的解的个数为例。
若为小于号,可以通过组合数轻松求出,因此我们可设 d i ′ = d i + i d'_i=d_i+i di′=di+i,则只需求解 0 < d 1 ′ < ⋯ < d i − 1 ′ < d i ′ 0<d'_1<\cdots<d'_{i-1}<d'_i 0<d1′<⋯<di−1′<di′ 的个数,方案数为 d i ′ − 1 d'_i-1 di′−1 个空位选 i − 1 i-1 i−1 个数,即 ( d i ′ − 1 i − 1 ) = ( d i + i − 1 i − 1 ) \binom{d'_i-1}{i-1}=\binom{d_i+i-1}{i-1} (i−1di′−1)=(i−1di+i−1),同理右侧方案数为 ( S + n − d i − i − 1 n − i − 1 ) \binom{S+n-d_i-i-1}{n-i-1} (n−i−1S+n−di−i−1),因此代换掉 cnt ( i , d i ) \text{cnt}(i,d_i) cnt(i,di) 可得:
a n s = ∑ i = 1 n − 1 w i ( ∑ d i = 0 S ∣ c i − d i ∣ × ( d i + i − 1 i − 1 ) × ( S − d i + n − i − 1 n − i − 1 ) ) = ∑ i = 1 n − 1 w i ( 2 ∑ d i = 0 c i ( c i − d i ) × ( d i + i − 1 i − 1 ) × ( S − d i + n − i − 1 n − i − 1 ) + ∑ d i = 0 S ( d i − c i ) × ( d i + i − 1 i − 1 ) × ( S − d i + n − i − 1 n − i − 1 ) ) \begin{aligned} ans&=\sum_{i=1}^{n-1}w_i\Bigg(\sum_{d_i=0}^S|c_i-d_i|\times\binom{d_i+i-1}{i-1}\times \binom{S-d_i+n-i-1}{n-i-1}\Bigg)\\ &=\sum_{i=1}^{n-1}w_i\Bigg(2\sum_{d_i=0}^{c_i}(c_i-d_i)\times\binom{d_i+i-1}{i-1}\times\binom{S-d_i+n-i-1}{n-i-1}+\sum_{d_i=0}^S(d_i-c_i)\times \binom{d_i+i-1}{i-1}\times\binom{S-d_i+n-i-1}{n-i-1}\Bigg)\\ \end{aligned} ans=i=1∑n−1wi(di=0∑S∣ci−di∣×(i−1di+i−1)×(n−i−1S−di+n−i−1))=i=1∑n−1wi(2di=0∑ci(ci−di)×(i−1di+i−1)×(n−i−1S−di+n−i−1)+di=0∑S(di−ci)×(i−1di+i−1)×(n−i−1S−di+n−i−1))
设:
f ( n , S , i , k ) = ∑ d i = 0 k ( d i + i − 1 i − 1 ) × ( S − d i + n − i − 1 n − i − 1 ) f(n,S,i,k)=\sum_{d_i=0}^k \binom{d_i+i-1}{i-1}\times\binom{S-d_i+n-i-1}{n-i-1} f(n,S,i,k)=di=0∑k(i−1di+i−1)×(n−i−1S−di+n−i−1)
g ( n , S , i , k ) = ∑ d i = 0 k d i × ( d i + i − 1 i − 1 ) × ( S − d i + n − i − 1 n − i − 1 ) g(n,S,i,k)=\sum_{d_i=0}^kd_i\times \binom{d_i+i-1}{i-1}\times\binom{S-d_i+n-i-1}{n-i-1} g(n,S,i,k)=di=0∑kdi×(i−1di+i−1)×(n−i−1S−di+n−i−1)
则原式等价于:
∑ i = 1 n − 1 w i ( 2 c i × f ( n , S , i , c i ) − 2 g ( n , S , i , c i ) + g ( n , S , i , S ) − c i × f ( n , S , i , S ) ) \sum_{i=1}^{n-1}w_i\Bigg(2c_i\times f(n,S,i,c_i)-2g(n,S,i,c_i)+g(n,S,i,S)-c_i\times f(n,S,i,S)\Bigg) i=1∑n−1wi(2ci×f(n,S,i,ci)−2g(n,S,i,ci)+g(n,S,i,S)−ci×f(n,S,i,S))
考虑探究 g g g 与 f f f 的关系:
g ( n , S , i , k ) = ∑ d i = 0 k d i × ( d i + i − 1 i − 1 ) × ( S − d i + n − i − 1 n − i − 1 ) = ∑ d i = 1 k d i × ( d i + i − 1 d i ) × ( S − d i + n − i − 1 n − i − 1 ) = i × ∑ d i = 1 k ( d i + i − 1 i ) × ( S − d i + n − i − 1 n − i − 1 ) \begin{aligned} g(n,S,i,k)&=\sum_{d_i=0}^kd_i\times \binom{d_i+i-1}{i-1}\times\binom{S-d_i+n-i-1}{n-i-1}\\ &=\sum_{d_i=1}^kd_i\times \binom{d_i+i-1}{d_i}\times\binom{S-d_i+n-i-1}{n-i-1}\\ &=i\times\sum_{d_i=1}^k\binom{d_i+i-1}{i}\times\binom{S-d_i+n-i-1}{n-i-1}\\ \end{aligned} g(n,S,i,k)=di=0∑kdi×(i−1di+i−1)×(n−i−1S−di+n−i−1)=di=1∑kdi×(didi+i−1)×(n−i−1S−di+n−i−1)=i×di=1∑k(idi+i−1)×(n−i−1S−di+n−i−1)
由于左侧的 i i i 和 i − 1 i-1 i−1 不同,不符合 f f f 的形式,考虑 d i ← d i − 1 d_i\leftarrow d_i-1 di←di−1 得:
g ( n , S , i , k ) = i × ∑ d i = 0 k − 1 ( d i + i i ) × ( S − d i + n − i − 2 n − i − 1 ) = i × f ( n + 1 , S − 1 , i + 1 , k − 1 ) \begin{aligned} g(n,S,i,k)&=i\times\sum_{d_i=0}^{k-1}\binom{d_i+i}{i}\times\binom{S-d_i+n-i-2}{n-i-1}\\ &=i\times f(n+1,S-1,i+1,k-1)\\ \end{aligned} g(n,S,i,k)=i×di=0∑k−1(idi+i)×(n−i−1S−di+n−i−2)=i×f(n+1,S−1,i+1,k−1)
由于暴力计算 f ( n , S , i , k ) f(n,S,i,k) f(n,S,i,k) 显然不优,考虑增量计算。
即需得出 f ( n , S , i , k ) → f ( n , S , i + 1 , k ) f(n,S,i,k)\to f(n,S,i+1,k) f(n,S,i,k)→f(n,S,i+1,k) 和 f ( n , S , i , k ) → f ( n , S , i , k + 1 ) f(n,S,i,k)\to f(n,S,i,k+1) f(n,S,i,k)→f(n,S,i,k+1) 的关系式。
后者显然:
f ( n , S , i , k + 1 ) = f ( n , S , i , k ) + ( k + i i − 1 ) × ( S − k + n − i − 2 n − i − 1 ) f(n,S,i,k+1)=f(n,S,i,k)+\binom{k+i}{i-1}\times\binom{S-k+n-i-2}{n-i-1} f(n,S,i,k+1)=f(n,S,i,k)+(i−1k+i)×(n−i−1S−k+n−i−2)
前者考虑对 f ( n , S , i , k ) f(n,S,i,k) f(n,S,i,k) 的组合意义进行分析。
f ( n , S , i , k ) f(n,S,i,k) f(n,S,i,k) 即为 ( 0 , 0 ) → ( i − 1 , d i ) → ( i , d i ) → ( n − 1 , S ) (0,0)\to(i-1,d_i)\to(i,d_i)\to(n-1,S) (0,0)→(i−1,di)→(i,di)→(n−1,S) 的方案数。
而由于 d i ∈ [ 0 , k ] d_i\in[0,k] di∈[0,k],说明从第 k k k 行走向第 k + 1 k+1 k+1 行时的横坐标必然大于 i − 1 i-1 i−1。
于是 f ( n , S , i , k ) f(n,S,i,k) f(n,S,i,k) 即为 ( 0 , 0 ) → ( j , k ) → ( j , k + 1 ) → ( n − 1 , S ) (0,0)\to(j,k)\to(j,k+1)\to(n-1,S) (0,0)→(j,k)→(j,k+1)→(n−1,S) 的方案数,其中 j ∈ [ i , n ] j\in[i,n] j∈[i,n],因此:
f ( n , S , i , k ) = ∑ j = i n ( j + k j ) × ( n + S − j − k − 2 S − k − 1 ) f(n,S,i,k)=\sum_{j=i}^n\binom{j+k}{j}\times\binom{n+S-j-k-2}{S-k-1} f(n,S,i,k)=j=i∑n(jj+k)×(S−k−1n+S−j−k−2)
则:
f ( n , S , i + 1 , k ) = f ( n , S , i , k ) − ( i + k i ) × ( n + S − i − k − 2 S − k − 1 ) f(n,S,i+1,k)=f(n,S,i,k)-\binom{i+k}{i}\times\binom{n+S-i-k-2}{S-k-1} f(n,S,i+1,k)=f(n,S,i,k)−(ii+k)×(S−k−1n+S−i−k−2)
回到原式:
a n s = ∑ i = 1 n − 1 w i ( 2 c i × f ( n , S , i , c i ) − 2 i × f ( n + 1 , S − 1 , i + 1 , c i − 1 ) + i × f ( n + 1 , S − 1 , i + 1 , S − 1 ) − c i × f ( n , S , i , S ) ) = ∑ i = 1 n − 1 w i ( c i × ( 2 f ( n , S , i , c i ) − f ( n , S , i , S ) ) + i × ( f ( n + 1 , S − 1 , i + 1 , S − 1 ) − 2 f ( n + 1 , S − 1 , i + 1 , c i − 1 ) ) ) \begin{aligned} ans&=\sum_{i=1}^{n-1}w_i\Bigg(2c_i\times f(n,S,i,c_i)-2i\times f(n+1,S-1,i+1,c_i-1)+i\times f(n+1,S-1,i+1,S-1)-c_i\times f(n,S,i,S)\Bigg)\\ &=\sum_{i=1}^{n-1}w_i\Bigg(c_i\times\Big(2f(n,S,i,c_i)-f(n,S,i,S)\Big)+i\times\Big(f(n+1,S-1,i+1,S-1)-2f(n+1,S-1,i+1,c_i-1)\Big)\Bigg)\\ \end{aligned} ans=i=1∑n−1wi(2ci×f(n,S,i,ci)−2i×f(n+1,S−1,i+1,ci−1)+i×f(n+1,S−1,i+1,S−1)−ci×f(n,S,i,S))=i=1∑n−1wi(ci×(2f(n,S,i,ci)−f(n,S,i,S))+i×(f(n+1,S−1,i+1,S−1)−2f(n+1,S−1,i+1,ci−1)))
由于 i , c i i,c_i i,ci 单调不降,直接增量维护四个不同的 f f f 即可。
#include <bits/stdc++.h>
using namespace std;
const int p=998244353;
long long T,n,S,a[500005],w[500005],fac[3000005],ifac[3000005],c[500005];
inline long long qpow(long long a,long long b){
int res=1;
for (;b;b>>=1,a=1ll*a*a%p) if (b&1) res=1ll*res*a%p;
return res;
}
inline long long C(long long n,long long m){
return fac[n]*ifac[m]%p*ifac[n-m]%p;
}
struct f{
long long n,S,i,k,res;
void init(long long n0,long long S0,long long i0,long long k0){
n=n0,S=S0,i=i0,k=k0,res=0;
for (long long di=0;di<=k;di++) (res+=1ll*C(di+i-1,i-1)*C(S-di+n-i-1,n-i-1)%p)%=p;
}
void movek(long long K){
if (k>=K) return;
for (;k<K;k++) res+=C(k+i,i-1)*C(S-k+n-i-2,n-i-1)%p;
res%=p;
}
void movei(long long I){
if (i>=I) return;
for (;i<I;i++) res+=p-C(i+k,i)*C(n+S-i-k-2,S-k-1)%p;
res%=p;
}
}f1,f2,f3,f4;
int main(){
scanf("%lld",&T);
fac[0]=1;
for (int i=1;i<=3e6;i++) fac[i]=fac[i-1]*i%p;
ifac[3000000]=qpow(fac[3000000],p-2);
for (int i=3e6-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%p;
while (T--){
scanf("%lld",&n),S=0;
for (int i=1;i<=n;i++) scanf("%lld",&a[i]),S+=a[i],c[i]=c[i-1]+a[i];
for (int i=1;i<n;i++) scanf("%lld",&w[i]);
long long ans=0;
f1.init(n,S,1,c[1]),f2.init(n,S,1,S),f3.init(n+1,S-1,2,S-1),f4.init(n+1,S-1,2,c[1]-1);
for (int i=1;i<n;i++){
f1.movei(i),f2.movei(i),f3.movei(i+1),f4.movei(i+1);
f1.movek(c[i]),f4.movek(c[i]-1);
(ans+=w[i]*(c[i]*(2*f1.res-f2.res+p)%p+i*(f3.res-2*f4.res+p)%p))%=p;
}
printf("%lld\n",(ans+p)%p);
}
return 0;
}