#include <bits/stdc++.h> using namespace std; typedef signed long long ll; #define _P(...) (void)printf(__VA_ARGS__) #define FOR(x,to) for(x=0;x<(to);x++) #define FORR(x,arr) for(auto& x:arr) #define FORR2(x,y,arr) for(auto& [x,y]:arr) #define ALL(a) (a.begin()),(a.end()) #define ZERO(a) memset(a,0,sizeof(a)) #define MINUS(a) memset(a,0xff,sizeof(a)) template<class T> bool chmax(T &a, const T &b) { if(a<b){a=b;return 1;}return 0;} template<class T> bool chmin(T &a, const T &b) { if(a>b){a=b;return 1;}return 0;} //------------------------------------------------------- int N,M; int A[202020],B[202020]; ll dp[303][603]; ll dp2[603]; const ll mo=998244353; ll dp3[303][303*303*2]; ll comb(int P_,int Q_) { static const int N_=1020; static ll C_[N_][N_]; if(C_[0][0]==0) { int i,j; FOR(i,N_) C_[i][0]=C_[i][i]=1; for(i=1;i<N_;i++) for(j=1;j<i;j++) C_[i][j]=(C_[i-1][j-1]+C_[i-1][j])%mo; } if(P_<0 || P_>N_ || Q_<0 || Q_>P_) return 0; return C_[P_][Q_]; } void solve() { int i,j,k,l,r,x,y; string s; cin>>N>>M; FOR(i,N) cin>>A[i]; FOR(i,N) cin>>B[i]; FOR(i,M) { FOR(j,601) dp[i][j]=1; for(k=i;k<N;k+=M) { ZERO(dp2); FOR(x,A[k]+1) FOR(y,B[k]+1) (dp2[300+x-y]+=comb(A[k],x)*comb(B[k],y))%=mo; FOR(j,601) (dp[i][j]*=dp2[j])%=mo;; } } dp3[0][0]=1; FOR(i,M) { FOR(j,600*i+1) { FOR(x,601) (dp3[i+1][j+x]+=dp[i][x]*dp3[i][j])%=mo; } } cout<<dp3[M][300*M]<<endl; } int main(int argc,char** argv){ string s;int i; if(argc==1) ios::sync_with_stdio(false), cin.tie(0); FOR(i,argc-1) s+=argv[i+1],s+='\n'; FOR(i,s.size()) ungetc(s[s.size()-1-i],stdin); cout.tie(0); solve(); return 0; }