lz已经急了
#include<bits/stdc++.h>
using namespace std;
#define res f[i][sp][sq]
const int N=105,D=1005,mod=998244353;
int inline read()
{
int num=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
return num*f;
}
int n,d,i,p[N],q[N];
int f[N][D][D],ans;
int kpos[N][N],kneg[N][N];
int inc(int x,int y){return x+y>=mod?x+y-mod:x+y;}
int dec(int x,int y){return x-y<0?x-y+mod:x-y;}
int CalcPos(int sx,int sy,int ex,int ey)
{
if(sx>sy)return 0;
return dec(kpos[ex][ey],(sx>0&&sy>0)?kpos[sx-1][sy-1]:0);
} // LeftDown - RightUp
int CalcNeg(int sx,int sy,int ex,int ey)
{
if(sx>sy)return 0;
return dec(kneg[ex][ey],(sx>0&&sy<d)?kneg[sx-1][sy+1]:0);
} // LeftUp - RightDown
void maintain()
{
memset(kpos,0,sizeof(kpos));memset(kneg,0,sizeof(kneg));
for(int sp=0;sp<=d;sp++)
{
for(int sq=0;sq<=d;sq++)
{
if(sp>0&&sq>0)kpos[sp][sq]=inc(kpos[sp-1][sq-1],res);
else kpos[sp][sq]=res;
}
}
for(int sp=0;sp<=d;sp++)
{
for(int sq=d;sq>=0;sq--)
{
if(sp>0&&sq<d)kneg[sp][sq]=inc(kneg[sp-1][sq+1],res);
else kneg[sp][sq]=res;
}
}
}
int main(){
n=read();d=read();
for(int i=1;i<=n;i++)p[i]=read();
for(int i=1;i<=n;i++)q[i]=read();
f[0][0][0]=1;maintain();
for(i=1;i<=n;i++)
{
for(int sp=0;sp<=d;sp++)
{
for(int sq=0;sq<=d;sq++)
{
int L=max(p[i]-sp,q[i]-sq),R=min(p[i]+sp,q[i]+sq); // r in range of L to R
if(L>R)continue;
/*
for(int r=L;r<=R;r++)
{
int wp=abs(p[i]-r),wq=abs(q[i]-r);
f[i][sp][sq]=inc(f[i][sp][sq],f[i-1][sp-wp][sq-wq]);
}
*/
// /*
int mn=min(p[i],q[i]),mx=max(p[i],q[i]);
int sx,sy,ex,ey;
// situation 1 : r in range of L to mn-1
if(L<mn)
{
sx=L+(sp-p[i]);sy=L+(sq-q[i]);
ex=min((mn-1),R)+(sp-p[i]);ey=min((mn-1),R)+(sq-q[i]);
printf("%d %d %d %d\n",sx,sy,ex,ey);
res=inc(res,CalcPos(sx,sy,ex,ey));
}
// situation 2 : r in range of mn to mx
if(p[i]<=q[i])
{
sx=-max(R,mx)+(sp+p[i]);sy=max(R,mx)+(sq-q[i]);
ex=-min(L,mn)+(sp+p[i]);ey=min(L,mn)+(sq-q[i]);
}
else
{
sx=min(L,mn)+(sp-p[i]);sy=-min(L,mn)+(sq+q[i]);
ex=max(R,mx)+(sp-p[i]);ey=-max(R,mx)+(sq+q[i]);
}
printf("%d %d %d %d\n",sx,sy,ex,ey);
res=inc(res,CalcNeg(sx,sy,ex,ey));
//situation 3 : r in range of mx+1 to R
if(mx<R)
{
sx=-R+(sp+p[i]);sy=-R+(sq+q[i]);
ex=-max((mx+1),L)+(sp+p[i]);ey=-max((mx+1),L)+(sq+q[i]);
printf("%d %d %d %d\n",sx,sy,ex,ey);
res=inc(res,CalcPos(sx,sy,ex,ey));
}
printf("\n\n");
// */
}
}
maintain();
}
for(int sp=0;sp<=d;sp++)
for(int sq=0;sq<=d;sq++)
ans=inc(ans,f[n][sp][sq]);
printf("%d",ans);
return 0;
}