#include <bits/stdc++.h>
#include <iostream>
#include <string>
#include <cstdlib>
#include <string.h>
#include <vector>
#include <cstdio>
#include <iomanip>
#include <stack>
#include <set>
#include <map>
#include <list>
#include <ctime>
#include <algorithm>
#include <cmath>
#define PI 3.1415926535897932384626433832795l
#define IOS ios :: sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define deci(n) cout<<fixed<<setprecision(n);
#define F first
#define S second
#define mk make_pair
#define pb push_back
#define ALPHA 27
#define ll long long int
#define ld long double
#define mmset(arr, n) memset(arr, n, sizeof arr)
#define debug(x) cerr << '#' << ' ' << x << '\n'
#define len(s) s.length()
#define ForA(i,a,b) for(int i = a; i < b; i++)
#define ForA1(i,a,b) for(int i = b - 1; i >= a; i--)
#define ForB1(i,a,b) for(int i = b; i > a; i--)
#define ForB(i,a,b) for(int i = a; i <= b; i++)
#define INT_SIZE 18
#define maxn 100010
using namespace std;
#define MAX 10000002
const ll INF = (ll)(8e18);
const ll MOD = 1000000007;
const ll Maxn = 1000000000000;
ll F[maxn], Ans[maxn];
vector<int> stacker;
int total = 0, N = 0, Number;
int prime[MAX];
unordered_map<int, int> prime_count;
// Function to store smallest prime factor
// in prime[]
void sieve()
{
memset(prime, 0, sizeof(prime));
prime[0] = prime[1] = 1;
for (int i = 2; i * i < MAX; i++) {
if (prime[i] == 0) {
for (int j = i * 2; j < MAX; j += i) {
if (prime[j] == 0)
prime[j] = i;
}
}
}
for (int i = 2; i < MAX; i++) {
// If the number is prime then
// it's the smallest prime factor
// is the number itself
if (prime[i] == 0)
prime[i] = i;
}
}
// Function to return the count of the divisors for
// the product of all the numbers from the array
long long numberOfDivisorsOfProduct(vector<int> arr,
int n)
{
for (int i = 0; i < n; i++) {
int temp = arr[i];
while (temp != 1) {
// Increase the count of prime
// encountered
prime_count[prime[temp]]++;
temp = temp / prime[temp];
}
}
long long ans = 1;
// Multiplying the count of primes
// encountered
unordered_map<int, int>::iterator it;
for (it = prime_count.begin();
it != prime_count.end(); it++) {
ans = ans * (it->second + 1);
}
return ans;
}
void addEdge(vector<int> v[],
int x,
int y)
{
v[x].push_back(y);
v[y].push_back(x);
}
vector<int> prod;
vector<int> cost;
void printPath()
{
int i;
for (i = 0; i < (int)stacker.size() - 1;
i++) {
cout << stacker[i] << " -> ";
prod.push_back(cost[stacker[i]]);
cout<<prod[i]<<"\n";
}
cout << stacker[i];
prod.push_back(cost[stacker[i]]);
}
void DFS(vector<int> v[],
bool vis[],
int x,
int y)
{
stacker.push_back(x);
if (x == y) {
printPath();
cout<<"\n";
return;
}
vis[x] = true;
int flag = 0;
if (!v[x].empty()) {
for (int j = 0; j < v[x].size(); j++) {
if (vis[v[x][j]] == false) {
DFS(v, vis, v[x][j], y);
flag = 1;
}
}
}
if (flag == 0) {
stacker.pop_back();
}
}
// DFS function for a given vertex x.
void DFSCall(int x,
int y,
vector<int> v[],
int n
)
{
bool vis[n + 1];
memset(vis, false, sizeof(vis));
DFS(v, vis, x, y);
}
// Driver program to test above functions
int main()
{
IOS;
// array of vectors is used to store the graph
// in the form of an adjacency list
sieve();
int source,dest;
int t,n;
cin>>t;
while(t--)
{
cin>>n;
int v=n+1;
vector<int> adj[v];
int s,e,k;
k=n-1;
while(k--)
{
cin>>s>>e;
addEdge(adj, s, e);
}
k=0;
int costp;
while(k!=n)
{cin>>costp;
cost.push_back(costp);
k++;}
int r;
cin>>r;
while(r--)
{
cin>>source>>dest;
DFSCall(source, dest, adj, n+1);
int zz=stacker.size();
//cout<<"Stack size="<<stacker.size()<<"\n";
//map<int, int> Counter;
/*int prod[stacker.size()];
int zz=stacker.size();
int i;*/
/*for (i = 0; i<(int)stacker.size()-1; i++)
{//prod=prod*cost[path[i]];
prod[i]=cost[stacker[i]];
//cout<<"path "<<i<<":"<<path[i]<<"\n";
}
prod[i]=cost[dest];*/
//for(int i=0;i<zz;i++)
//cout<<"arr="<<prod[i]<<" ";
//cout<<"\n";
if(source!=dest)
cout<<numberOfDivisorsOfProduct(prod,zz)%1000000007<<"\n";
else
{
//prod[0]=cost[dest];
cout<<numberOfDivisorsOfProduct(prod,1)%1000000007<<"\n";
}
stacker.clear();
prime_count.clear();
prod.clear();
}
cost.clear();
}
return 0;
}
CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxjc3RkbGliPiAKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHN0YWNrPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y21hdGg+CiNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1bAojZGVmaW5lIElPUyBpb3MgOjogc3luY193aXRoX3N0ZGlvKGZhbHNlKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCkKI2RlZmluZSBkZWNpKG4pIGNvdXQ8PGZpeGVkPDxzZXRwcmVjaXNpb24obik7CiNkZWZpbmUgRiBmaXJzdAojZGVmaW5lIFMgc2Vjb25kCiNkZWZpbmUgbWsgbWFrZV9wYWlyCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgQUxQSEEgMjcKI2RlZmluZSBsbCBsb25nIGxvbmcgaW50CiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBtbXNldChhcnIsIG4pIG1lbXNldChhcnIsIG4sIHNpemVvZiBhcnIpCiNkZWZpbmUgZGVidWcoeCkgY2VyciA8PCAnIycgPDwgJyAnIDw8IHggPDwgJ1xuJwojZGVmaW5lIGxlbihzKSBzLmxlbmd0aCgpCiNkZWZpbmUgRm9yQShpLGEsYikgZm9yKGludCBpID0gYTsgaSA8IGI7IGkrKykKI2RlZmluZSBGb3JBMShpLGEsYikgZm9yKGludCBpID0gYiAtIDE7IGkgPj0gYTsgaS0tKQojZGVmaW5lIEZvckIxKGksYSxiKSBmb3IoaW50IGkgPSBiOyBpID4gYTsgaS0tKQojZGVmaW5lIEZvckIoaSxhLGIpIGZvcihpbnQgaSA9IGE7IGkgPD0gYjsgaSsrKQojZGVmaW5lIElOVF9TSVpFIDE4IAojZGVmaW5lIG1heG4gMTAwMDEwCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIE1BWCAxMDAwMDAwMiAKY29uc3QgbGwgSU5GID0gKGxsKSg4ZTE4KTsKY29uc3QgbGwgTU9EID0gMTAwMDAwMDAwNzsKY29uc3QgbGwgTWF4biA9IDEwMDAwMDAwMDAwMDA7CgpsbCBGW21heG5dLCBBbnNbbWF4bl07CnZlY3RvcjxpbnQ+IHN0YWNrZXI7CmludCB0b3RhbCA9IDAsIE4gPSAwLCBOdW1iZXI7CgppbnQgcHJpbWVbTUFYXTsKCnVub3JkZXJlZF9tYXA8aW50LCBpbnQ+IHByaW1lX2NvdW50OyAKCi8vIEZ1bmN0aW9uIHRvIHN0b3JlIHNtYWxsZXN0IHByaW1lIGZhY3RvciAKLy8gaW4gcHJpbWVbXSAKdm9pZCBzaWV2ZSgpIAp7IAoJbWVtc2V0KHByaW1lLCAwLCBzaXplb2YocHJpbWUpKTsgCglwcmltZVswXSA9IHByaW1lWzFdID0gMTsgCglmb3IgKGludCBpID0gMjsgaSAqIGkgPCBNQVg7IGkrKykgeyAKCQlpZiAocHJpbWVbaV0gPT0gMCkgeyAKCQkJZm9yIChpbnQgaiA9IGkgKiAyOyBqIDwgTUFYOyBqICs9IGkpIHsgCgkJCQlpZiAocHJpbWVbal0gPT0gMCkgCgkJCQkJcHJpbWVbal0gPSBpOyAKCQkJfSAKCQl9IAoJfSAKCWZvciAoaW50IGkgPSAyOyBpIDwgTUFYOyBpKyspIHsgCgoJCS8vIElmIHRoZSBudW1iZXIgaXMgcHJpbWUgdGhlbiAKCQkvLyBpdCdzIHRoZSBzbWFsbGVzdCBwcmltZSBmYWN0b3IgCgkJLy8gaXMgdGhlIG51bWJlciBpdHNlbGYgCgkJaWYgKHByaW1lW2ldID09IDApIAoJCQlwcmltZVtpXSA9IGk7IAoJfSAKfSAKCi8vIEZ1bmN0aW9uIHRvIHJldHVybiB0aGUgY291bnQgb2YgdGhlIGRpdmlzb3JzIGZvciAKLy8gdGhlIHByb2R1Y3Qgb2YgYWxsIHRoZSBudW1iZXJzIGZyb20gdGhlIGFycmF5IApsb25nIGxvbmcgbnVtYmVyT2ZEaXZpc29yc09mUHJvZHVjdCh2ZWN0b3I8aW50PiBhcnIsIAoJCQkJCQkJCQkJCWludCBuKSAKeyAKCglmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeyAKCQlpbnQgdGVtcCA9IGFycltpXTsgCgkJd2hpbGUgKHRlbXAgIT0gMSkgeyAKCgkJCS8vIEluY3JlYXNlIHRoZSBjb3VudCBvZiBwcmltZSAKCQkJLy8gZW5jb3VudGVyZWQgCgkJCXByaW1lX2NvdW50W3ByaW1lW3RlbXBdXSsrOyAKCQkJdGVtcCA9IHRlbXAgLyBwcmltZVt0ZW1wXTsgCgkJfSAKCX0gCgoJbG9uZyBsb25nIGFucyA9IDE7IAoKCS8vIE11bHRpcGx5aW5nIHRoZSBjb3VudCBvZiBwcmltZXMgCgkvLyBlbmNvdW50ZXJlZCAKCXVub3JkZXJlZF9tYXA8aW50LCBpbnQ+OjppdGVyYXRvciBpdDsgCglmb3IgKGl0ID0gcHJpbWVfY291bnQuYmVnaW4oKTsgCgkJaXQgIT0gcHJpbWVfY291bnQuZW5kKCk7IGl0KyspIHsgCgkJYW5zID0gYW5zICogKGl0LT5zZWNvbmQgKyAxKTsgCgl9IAoKCXJldHVybiBhbnM7IAp9IAoKCnZvaWQgYWRkRWRnZSh2ZWN0b3I8aW50PiB2W10sIAogICAgICAgICAgICAgaW50IHgsIAogICAgICAgICAgICAgaW50IHkpIAp7IAogICAgdlt4XS5wdXNoX2JhY2soeSk7IAogICAgdlt5XS5wdXNoX2JhY2soeCk7IAp9IAogIAp2ZWN0b3I8aW50PiBwcm9kOwp2ZWN0b3I8aW50PiBjb3N0Owp2b2lkIHByaW50UGF0aCgpIAp7IAogICAgaW50IGk7IAogICAgZm9yIChpID0gMDsgaSA8IChpbnQpc3RhY2tlci5zaXplKCkgLSAxOyAKICAgICAgICAgaSsrKSB7IAogICAgICAgIGNvdXQgPDwgc3RhY2tlcltpXSA8PCAiIC0+ICI7CiAgICAgICAgcHJvZC5wdXNoX2JhY2soY29zdFtzdGFja2VyW2ldXSk7CiAgICAgICAgY291dDw8cHJvZFtpXTw8IlxuIjsKICAgIH0gCiAgICBjb3V0IDw8IHN0YWNrZXJbaV07IAogICAgcHJvZC5wdXNoX2JhY2soY29zdFtzdGFja2VyW2ldXSk7Cn0gCiAgCgp2b2lkIERGUyh2ZWN0b3I8aW50PiB2W10sIAogICAgICAgICBib29sIHZpc1tdLCAKICAgICAgICAgaW50IHgsIAogICAgICAgICBpbnQgeSkgCnsgCiAgICBzdGFja2VyLnB1c2hfYmFjayh4KTsgCiAgICBpZiAoeCA9PSB5KSB7IAogICAgCXByaW50UGF0aCgpOwogICAgCWNvdXQ8PCJcbiI7CiAgICAgICAgcmV0dXJuOyAKICAgIH0gCiAgICB2aXNbeF0gPSB0cnVlOyAKICAgIGludCBmbGFnID0gMDsgCiAgICBpZiAoIXZbeF0uZW1wdHkoKSkgeyAKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHZbeF0uc2l6ZSgpOyBqKyspIHsgCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodmlzW3ZbeF1bal1dID09IGZhbHNlKSB7IAogICAgICAgICAgICAgICAgREZTKHYsIHZpcywgdlt4XVtqXSwgeSk7IAogICAgICAgICAgICAgICAgZmxhZyA9IDE7IAogICAgICAgICAgICB9IAogICAgICAgIH0gCiAgICB9IAogICAgaWYgKGZsYWcgPT0gMCkgeyAKICAKICAgICAgIAogICAgICAgIHN0YWNrZXIucG9wX2JhY2soKTsgCiAgICB9IAp9IAogIAovLyBERlMgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gdmVydGV4IHguIAp2b2lkIERGU0NhbGwoaW50IHgsIAogICAgICAgICAgICAgaW50IHksIAogICAgICAgICAgICAgdmVjdG9yPGludD4gdltdLCAKICAgICAgICAgICAgIGludCBuIAogICAgICAgICAgICAgKSAKeyAKICAgIGJvb2wgdmlzW24gKyAxXTsgCiAgCiAgICBtZW1zZXQodmlzLCBmYWxzZSwgc2l6ZW9mKHZpcykpOyAKICAgIERGUyh2LCB2aXMsIHgsIHkpOyAKfSAKCi8vIERyaXZlciBwcm9ncmFtIHRvIHRlc3QgYWJvdmUgZnVuY3Rpb25zIAppbnQgbWFpbigpIAp7IAoJSU9TOwoKCS8vIGFycmF5IG9mIHZlY3RvcnMgaXMgdXNlZCB0byBzdG9yZSB0aGUgZ3JhcGggCgkvLyBpbiB0aGUgZm9ybSBvZiBhbiBhZGphY2VuY3kgbGlzdCAKCQoJc2lldmUoKTsKCWludCBzb3VyY2UsZGVzdDsgCiAKCQoJaW50IHQsbjsKCWNpbj4+dDsKCXdoaWxlKHQtLSkKCXsKCSAgICAKCSAgICAKCQljaW4+Pm47CgkJaW50IHY9bisxOwoJCXZlY3RvcjxpbnQ+IGFkalt2XTsgCgkJaW50IHMsZSxrOwoJCQoJCWs9bi0xOwoJCXdoaWxlKGstLSkKCQl7CgkJCWNpbj4+cz4+ZTsKCQkJYWRkRWRnZShhZGosIHMsIGUpOyAKCQl9CgkJaz0wOwoJCWludCBjb3N0cDsKCQl3aGlsZShrIT1uKQoJCXtjaW4+PmNvc3RwOwoJCWNvc3QucHVzaF9iYWNrKGNvc3RwKTsKCQlrKys7fQoJCWludCByOwoJCQoJCWNpbj4+cjsKCQl3aGlsZShyLS0pCgkJewoJCQkKCQkJY2luPj5zb3VyY2U+PmRlc3Q7CgkJCURGU0NhbGwoc291cmNlLCBkZXN0LCBhZGosIG4rMSk7CgkJCWludCB6ej1zdGFja2VyLnNpemUoKTsKCQkJLy9jb3V0PDwiU3RhY2sgc2l6ZT0iPDxzdGFja2VyLnNpemUoKTw8IlxuIjsKCQkJCS8vbWFwPGludCwgaW50PiBDb3VudGVyOwoJCQkJLyppbnQgcHJvZFtzdGFja2VyLnNpemUoKV07CgkJCQlpbnQgeno9c3RhY2tlci5zaXplKCk7CgkJCQlpbnQgaTsqLwoJCQkvKmZvciAoaSA9IDA7IGk8KGludClzdGFja2VyLnNpemUoKS0xOyBpKyspCgkJCXsvL3Byb2Q9cHJvZCpjb3N0W3BhdGhbaV1dOwoJCQkKCQkJcHJvZFtpXT1jb3N0W3N0YWNrZXJbaV1dOwoJCQkvL2NvdXQ8PCJwYXRoICI8PGk8PCI6Ijw8cGF0aFtpXTw8IlxuIjsKCQkJCgkJCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAoJCQl9CgkJCXByb2RbaV09Y29zdFtkZXN0XTsqLwoJCQkKCQkJLy9mb3IoaW50IGk9MDtpPHp6O2krKykKCQkJLy9jb3V0PDwiYXJyPSI8PHByb2RbaV08PCIgIjsKCQkJLy9jb3V0PDwiXG4iOwoJCQkKCQkJaWYoc291cmNlIT1kZXN0KQoJCQljb3V0PDxudW1iZXJPZkRpdmlzb3JzT2ZQcm9kdWN0KHByb2QsenopJTEwMDAwMDAwMDc8PCJcbiI7CgkJCWVsc2UKCQkJewoJCQkJLy9wcm9kWzBdPWNvc3RbZGVzdF07CgkJCWNvdXQ8PG51bWJlck9mRGl2aXNvcnNPZlByb2R1Y3QocHJvZCwxKSUxMDAwMDAwMDA3PDwiXG4iOwoJCQl9CgkJCXN0YWNrZXIuY2xlYXIoKTsKCQkJcHJpbWVfY291bnQuY2xlYXIoKTsKCQkJcHJvZC5jbGVhcigpOwoJCX0KCQljb3N0LmNsZWFyKCk7CgkJCgl9CgkKCQoJCglyZXR1cm4gMDsgCn0g