记:ans=ak2+a22+...+an2,
t=ak+a2+...+an
则ans′=(ak+1)2+...+(an+1)2
=ans+2t+n−k+1(此时第一个值得放最后的为k)
t′=t+n−k+1
代码如下:
for(int i=k+1;i<=n;i++) {
tot2=(tot2+((a[i]+1)*(a[i]+1))%P)%P;
tot3=(tot3+a[i]+1)%P;
}
ans=(ans+tot1+tot2)%P;
for(int i=2;i<=m;i++) {
tot2=(tot2+2*tot3+n-k)%P;
tot3=(tot3+n-k)%P;
while(k!=0&&-a[k]-1<a[k]+i) {
tot1=(tot1-((a[k]+1)*(a[k]+1))%P+2*P)%P;
tot2=(tot2+((a[k]+i)*(a[k]+i))%P)%P;
tot3=(tot3+a[k]+i)%P;
k--;
}
ans=(ans+tot1+tot2)%P;
}
为什么大样例过不了呢