题链:https://pintia.cn/problem-sets/1330210570443206656/problems/1330211663055204355
题目:
思路:
唯一需要注意的是,有负数。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 998244353;
const int N = 5e3+10;
int n,q,x;
ll b[N],c[N],dp[2][N];
int main(void){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&b[i]),b[i]=(b[i]%mod+mod)%mod;
for(int i=1;i<=n;i++)
scanf("%lld",&c[i]),c[i]=(c[i]%mod+mod)%mod;
int pos=0;
dp[0][0]=dp[1][0]=1;
for(int i=1;i<=n;i++){
pos^=1;
dp[pos][0]=dp[pos^1][0]*c[i]%mod;
for(int j=1;j<=i;j++)
dp[pos][j]=(dp[pos^1][j]*c[i]%mod+dp[pos^1][j-1]*b[i]%mod)%mod;
}
scanf("%d",&q);
while(q--){
scanf("%d",&x);
printf("%lld\n",dp[pos][x]);
}
return 0;
}