蒟蒻代码多次CE但找不到原因,在抱着再试一次的心态下又交了一发,突然AC了,将AC代码又交了若干发,有时AC有时CE。哪位大佬愿意指点一下原因,感激不尽。
代码是参照第三篇题解题解写的。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int M=3e6+5,mod=998244353;
int n,m,t,ans;
int pre[M+5]={1},rep[M+5],sum[M],w[M];
inline int read(){
int ans=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){ans=(ans<<3)+(ans<<1)+(ch^48);ch=getchar();}
return ans*w;
}
inline int pw(int x,int y){
int ans=1;
while(y){
if(y&1)ans=ans*x%mod;
x=x*x%mod,y>>=1;
}
return ans;
}
inline int C(int x,int y){if(x<y||x<0||y<0)return 0;return pre[x]*rep[y]%mod*rep[x-y]%mod;}//***
struct node{
int sum,i,s,X,Y;
inline void init(int x,int y,int ii,int ss){
sum=0;i=ii,s=ss;X=x,Y=y;
for(int j=0;j<=ss;j++){
sum=(sum+C(i+j-1,i-1)*C(x-i+y-j-1,x-i-1)%mod)%mod;
}
}
inline void move_i(int ii){
if(i>=ii)return;
for(int j=i+1;j<=ii;j++){
sum=(sum-C(j+s-1,j-1)*C(X-j+Y-s-1,X-j)%mod)%mod;
}
i=ii;
}
inline void move_s(int ss){
if(s>=ss)return;
for(int j=s+1;j<=ss;j++){
sum=(sum+C(i+j-1,i-1)*C(X-i+Y-j-1,X-i-1)%mod)%mod;
}
s=ss;
}
}tl[4];
void sol(){
n=read();ans=0;
for(int i=1;i<=n;i++)sum[i]=sum[i-1]+read();
for(int i=1;i<n;i++)w[i]=read();
tl[0].init(n,sum[n],1,sum[n]);//
tl[1].init(n+1,sum[n]-1,1,sum[n]-1);
tl[2].init(n,sum[n],1,0);//
tl[3].init(n+1,sum[n]-1,1,-1);
for(int i=1;i<n;i++){
tl[0].move_i(i);
tl[1].move_i(i+1);
tl[2].move_s(sum[i]),tl[2].move_i(i);
tl[3].move_s(sum[i]-1),tl[3].move_i(i+1);
int res=0;
res=(-sum[i]*tl[0].sum%mod+i*tl[1].sum%mod+2*sum[i]*tl[2].sum%mod-2*i*tl[3].sum%mod)%mod;
ans=(ans+res*w[i]%mod)%mod;
}
printf("%lld\n",(ans+mod)%mod);
}
signed main(){
t=read();
for(int i=1;i<M;i++)pre[i]=pre[i-1]*i%mod;
rep[M-1]=pw(pre[M-1],mod-2);
for(int i=M-2;~i;i--)rep[i]=rep[i+1]*(i+1)%mod;
while(t--)sol();
return 0;
}