#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
const int N=5010;
int T,n,x,y;
int a[N],b[N],dp[N][N];
int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
int dec(int x,int y){return x<y?x-y+mod:x-y;}
int mul(int x,int y){return 1ll*x*y%mod;}
int ksm(int x,int y){
int ans=1;
for (;y;y>>=1,x=mul(x,x)) if (y&1) ans=mul(ans,x);
return ans;
}
int main(){
scanf("%d",&T);
while (T--){
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%d%d",&x,&y);
a[i]=mul(x,ksm(y,mod-2));
b[i]=(1-a[i]+mod)%mod;
}
for (int i=0;i<=n;i++) scanf("%d",&dp[1][i]);
for (int i=2;i<=n+1;i++)
for (int j=0;j<=n;j++) dp[i][j]=0;
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++) dp[i+1][j-1]=add(dp[i+1][j-1],mul(dp[i][j],a[i]));
for (int j=0;j<n;j++) dp[i+1][j+1]=add(dp[i+1][j+1],mul(dp[i][j],b[i]));
dp[i+1][0]=add(dp[i+1][0],mul(dp[i][0],b[i]));
}
for (int i=2;i<=n+1;i++) printf("%d ",dp[i][0]);
putchar('\n');
}
}
791. Custom Sort String | 787. Cheapest Flights Within K Stops |
779. K-th Symbol in Grammar | 701. Insert into a Binary Search Tree |
429. N-ary Tree Level Order Traversal | 739. Daily Temperatures |
647. Palindromic Substrings | 583. Delete Operation for Two Strings |
518. Coin Change 2 | 516. Longest Palindromic Subsequence |
468. Validate IP Address | 450. Delete Node in a BST |
445. Add Two Numbers II | 442. Find All Duplicates in an Array |
437. Path Sum III | 436. Find Right Interval |
435. Non-overlapping Intervals | 406. Queue Reconstruction by Height |
380. Insert Delete GetRandom O(1) | 332. Reconstruct Itinerary |
368. Largest Divisible Subset | 377. Combination Sum IV |
322. Coin Change | 307. Range Sum Query - Mutable |
287. Find the Duplicate Number | 279. Perfect Squares |
275. H-Index II | 274. H-Index |
260. Single Number III | 240. Search a 2D Matrix II |