#define ll long long #define I inline #define N 100010
usingnamespacestd;
constint HA = 10086; int n , a[N];
structEdge{ int from , to; int last; }edge[N << 1];
int edge_num; int head[N << 1];
I voidadd_edge(int from , int to){ edge[++ edge_num] = (Edge){from , to , head[from]}; head[from] = edge_num; }
ll ans , f[N];
voidsearch(int u , int fa){ ll sum = 0; f[u] = a[u]; //由于单独的一个点也是合法路径,所以我们需要加上单独一个点的答案 for(int i = head[u]; i ; i = edge[i].last){ int to = edge[i].to; if(to == fa) continue; search(to , u); f[u] += f[to] * a[u] , f[u] %= HA; //计算直链的答案 ans += sum * f[to] , ans %= HA; //单独加入折链的答案。 sum += f[to] * a[u] , sum %= HA; //重新计算折链的贡献,这一句必须放于上句之后,因为必定会有一条直链。 } ans += f[u] , ans %= HA; //最后加入直链的答案 }
intmain(){ int u , v; cin >> n; for(int i = 1; i <= n; i ++){ cin >> a[i]; } for(int i = 1; i <= n - 1; i ++){ cin >> u >> v; add_edge(u , v); add_edge(v , u); } search(1 , 0); cout << ans % HA << "\n"; return0; }