#include <bits/stdc++.h>
using namespace std;
unordered_map<int,int>mpp;
int sum = 0;
int val[1000000] = {0};
int vlSubarrays = 0;
void dfs(int node , vector<int> adj[] , int used[] , int parent[] , int k){
used[node]=1;
sum += val[node];
int x = sum % k;
vlSubarrays+= mpp[x];
mpp[x]++;
for(auto u:adj[node]){
if(used[u]==0){
parent[u] = node;
dfs(u,adj,used,parent,k);
}
}
sum -= val[node];
mpp[x]--;
}
int main() {
int n ;
cin>>n ;
vector <int> adj[n+1];
int i = 1 ;
while(i<=n-1){
int u,v;
cin>>u>>v ;
adj[u].push_back(v);
adj[v].push_back(u);
i++;
}
for(int i=1;i<=n;i++){
cin>>val[i];
}
int k;
cin>>k;
int used[n+1] = {0};
int parent[n+1] = {0};
mpp[0] = 1;
dfs(1,adj,used,parent,k);
cout<<"No of Valid Subarrays are: "<<vlSubarrays<<endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1bm9yZGVyZWRfbWFwPGludCxpbnQ+bXBwOwoKaW50IHN1bSA9IDA7CmludCB2YWxbMTAwMDAwMF0gPSB7MH07CmludCB2bFN1YmFycmF5cyA9IDA7Cgp2b2lkIGRmcyhpbnQgbm9kZSAsIHZlY3RvcjxpbnQ+IGFkaltdICwgaW50IHVzZWRbXSAsIGludCBwYXJlbnRbXSAsIGludCBrKXsKCQoJdXNlZFtub2RlXT0xOwoJCglzdW0gKz0gdmFsW25vZGVdOwoJaW50IHggPSBzdW0gJSBrOwoJdmxTdWJhcnJheXMrPSBtcHBbeF07CgltcHBbeF0rKzsKCQoJZm9yKGF1dG8gdTphZGpbbm9kZV0pewoJCWlmKHVzZWRbdV09PTApewoJCQlwYXJlbnRbdV0gPSBub2RlOwoJCQlkZnModSxhZGosdXNlZCxwYXJlbnQsayk7CgkJfQoJfQoJCglzdW0gLT0gdmFsW25vZGVdOwoJbXBwW3hdLS07Cn0KCmludCBtYWluKCkgewoJCglpbnQgbiA7IAogICAgY2luPj5uIDsgCiAgICB2ZWN0b3IgPGludD4gYWRqW24rMV07CiAKICAgIGludCBpID0gMSA7IAogICAgd2hpbGUoaTw9bi0xKXsKICAgICAgICBpbnQgdSx2OwogICAgICAgIGNpbj4+dT4+diA7IAogICAgICAgIGFkalt1XS5wdXNoX2JhY2sodik7CiAgICAgICAgYWRqW3ZdLnB1c2hfYmFjayh1KTsgCiAgICAgICAgaSsrOwogICAgfQogICAgCiAgICBmb3IoaW50IGk9MTtpPD1uO2krKyl7CiAgICAJY2luPj52YWxbaV07CiAgICB9CiAgICBpbnQgazsKICAgIGNpbj4+azsKICAgIGludCB1c2VkW24rMV0gPSB7MH07CiAgICBpbnQgcGFyZW50W24rMV0gPSB7MH07CiAgICBtcHBbMF0gPSAxOwogICAgZGZzKDEsYWRqLHVzZWQscGFyZW50LGspOyAKICAgIGNvdXQ8PCJObyBvZiBWYWxpZCBTdWJhcnJheXMgYXJlOiAiPDx2bFN1YmFycmF5czw8ZW5kbDsKICAgIHJldHVybiAwOwp9