注意到:
l=1∑nr=l∑ni=l∑rj=l∑raibj=i=1∑nj=1∑nl=1∑min{i,j}r=max{i,j}∑naibj=i=1∑nj=1∑nmin{i,j}(n−max{i,j}+1)aibj=i=1∑n(n−i+1)aij=1∑ijbj+i=1∑niaij=i+1∑n(n−j+1)bj=i=1∑n(n−i+1)aij=1∑ijbj+j=1∑n(n−j+1)bji=1∑j−1iai
迭代计算即可(下面的代码假设数组下标从
0 至
n−1):
CPPint s = 0, t = 0;
for(int i = 0; i < n; ++i) {
t = (t + ll(i + 1) * B[i]) % MOD;
s = (s + ll(n - i) * A[i] % MOD * t) % MOD;
}
t = 0;
for(int i = 0; i < n; ++i) {
s = (s + ll(n - i) * B[i] % MOD * t) % MOD;
t = (t + ll(i + 1) * A[i]) % MOD;
}