#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <ctime>#include <vector>using namespace std;typedef long long LL;const int N = 50009;const LL M = 1000000007;inline void addIt(int &a, int b){ a += b; if(a >= M) a -= M;}inline int sub(int a, int b){ a -= b; if(a < 0) a += M; if(a >= M) a -= M; return a;}struct Num{ int p[11]; int allp;}num[N];struct Data{ int dp[N], div[N], all;}data[55], fb[55];int L[55], R[55];int ans[55];int n;vector<int> e[55];bool vis[55];int rcn, rcv;void print(){ for(int i = 0; i < n; i++) { printf("i = %dn", i); for(int j = 0; j < 6; j++) printf("dp[%d] = %dn", j, data[i].dp[j]); }}int rc(int i, int xs){ int t, r = 0; for(; i < num[rcn].allp; i++) { if(xs * num[rcn].p[i] <= R[rcv]) t = data[rcv].div[xs * num[rcn].p[i]]; else t = 0; addIt(r, sub(t, rc(i + 1, xs * num[rcn].p[i]))); } return r;}void dfsTree(int pre, int now){ if(vis[now]) return; vis[now] = true; int i, siz = e[now].size(); for(i = 0; i < siz; i++) dfsTree(now, e[now][i]); if(pre >= 0 && siz <= 1) for(i = L[now]; i <= R[now]; i++) data[now].dp[i] = 1; else for(i = L[now]; i <= R[now]; i++) { data[now].dp[i] = 1; for(int j = 0; j < siz; j++) if(e[now][j] != pre) { rcn = i; rcv = e[now][j]; data[now].dp[i] = (LL)(data[now].dp[i]) * sub(data[e[now][j]].all, rc(0, 1)) % M; } } data[now].all = 0; for(i = 1; i <= R[now]; i++) { data[now].div[i] = 0; for(int j = i; j <= R[now]; j += i) if(j >= L[now]) addIt(data[now].div[i], data[now].dp[j]); if(i >= L[now]) addIt(data[now].all, data[now].dp[i]); }}void dfs(int pre, int now, int deep){ dfsTree(-1, now); int i, siz = e[now].size(); ans[now] = 0; for(i = L[now]; i <= R[now]; i++) addIt(ans[now], (LL)data[now].dp[i] * i % M); for(i = 0; i < siz; i++) if(e[now][i] != pre) { vis[e[now][i]] = false; fb[deep] = data[e[now][i]]; vis[now] = false; dfs(now, e[now][i], deep + 1); data[e[now][i]] = fb[deep]; vis[e[now][i]] = true; }}void init(){ int i, j, k; for(i = 0; i < N; i++) num[i].allp = 0; for(i = 2; i < N; i++) if(num[i].allp == 0) for(j = i; j < N; j += i) num[j].p[num[j].allp++] = i;}int main(){ init(); int T; scanf("%d", &T); while(T--) { scanf("%d", &n); int i, j, k; for(i = 0; i < n; i++) { scanf("%d", &L[i]); } for(i = 0; i < n; i++) { scanf("%d", &R[i]); e[i].clear(); } for(i = 0; i < n - 1; i++) { scanf("%d %d", &j, &k); j--; k--; e[j].push_back(k); e[k].push_back(j); } memset(vis, false, sizeof(vis)); memset(data, 0, sizeof(data)); dfsTree(-1, 0); dfs(-1, 0, 0); for(i = 0; i < n - 1; i++) printf("%d ", ans[i]); printf("%dn", ans[i]); } return 0;}