1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| #include<algorithm> #include<cstring> #include<cstdio> #include<vector> #include<queue> #include<map> using namespace std; using pi=pair<int,int>; using ll=long long; using pl=pair<ll,ll>; using pli=pair<ll,int>; template<typename A> using vc=vector<A>; using vi=vector<int>; const int mod=998244353; const int RG=332748118; const int G=3; inline int read() { int s=0,w=1;char ch; while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1; while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } int wh[600001]; ll f[600001]; ll g[600001]; ll pre[100001]; ll dp[100001]; ll prew[100001]; int w[100001]; int p[100001]; int c[100001]; int n; ll qow(ll a,int b) { ll ans=1; while(b) { if(b&1) ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans; } inline void NTT(ll *f,int n,bool dft=true) { for(int i=0;i<n;i++) if(i<wh[i]) swap(f[i],f[wh[i]]); for(int len=2;len<=n;len<<=1) { ll step=qow(dft?G:RG,(mod-1)/len);int num=len>>1; for(int l=0,mid=num;l<n;l+=len,mid+=len) { ll s=1; for(int i=0;i<num;i++) { ll now=f[i+mid]*s%mod; f[i+mid]=(f[i+l]-now+mod)%mod; f[i+l]=(f[i+l]+now)%mod; s=s*step%mod; } } } if(!dft) { ll num=qow(n,mod-2); for(int i=0;i<n;i++) f[i]=f[i]*num%mod; } } inline void NTT(int n) { for(int i=1;i<n;i++) wh[i]=(wh[i>>1]>>1)+(i&1?n>>1:0); NTT(f,n),NTT(g,n); for(int i=0;i<n;i++) f[i]=f[i]*g[i]%mod; NTT(f,n,false); } void fz(int l,int r) { if(l==r) { if(l==0) return ; dp[l]=mod-dp[l]*(mod+1-p[l-1])%mod*qow(prew[l-1],mod-2)%mod; dp[l]=(dp[l]+c[l-1]+pre[l-1]*(mod+1-p[l-1]))%mod; dp[l]=dp[l]*qow(p[l-1],mod-2)%mod; pre[l]=(pre[l-1]+dp[l])%mod; return ; } int mid=(l+r)>>1; fz(l,mid); int len=(r-l+1)<<1,nb=1; for(;nb<=len;nb<<=1); for(int i=0;i<nb;i++) f[i]=g[i]=0; for(int i=l;i<=mid;i++) f[i-l]=pre[i]; for(int i=1;i<=r-l+1;i++) g[i]=w[i]; NTT(nb); for(int i=mid+1;i<=r;i++) dp[i]=(dp[i]+f[i-l-1])%mod; fz(mid+1,r); } int main() { int t=read(); while(t--) { n=read();ll num=qow(100,mod-2); for(int i=0;i<n;i++) p[i]=read()*num%mod,c[i]=read(); for(int i=1;i<n;i++) w[i]=read(),prew[i]=prew[i-1]+w[i]; fz(0,n); printf("%lld\n",pre[n]); for(int i=0;i<=n;i++) dp[i]=pre[i]=0; } return 0; }
|