#include <bits/stdc++.h>
#pragma GCC optimize("O2,Ofast,inline,unroll-all-loops,-ffast-math")
using namespace std;
inline void rd(long long &X) {
  X = 0;
  long long w = 0;
  char ch = 0;
  while (!isdigit(ch)) w |= ch == '-', ch = getchar();
  while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
  X = w ? -X : X;
}
long long v[100005], a[100005];
long long in[100005], out[100005];
long long n, p, k, m, rt, ans;
map<long long, long long> s1, s2;
long long head[100005], cnt, sum;
long long Pow[100005], inv[100005], sz[100005], mx[100005];
struct nd {
  long long nxt, to;
} e[100005 << 1];
inline void add(long long x, long long y) {
  e[++cnt] = {head[x], y};
  head[x] = cnt;
  e[++cnt] = {head[y], x};
  head[y] = cnt;
}
long long Inv(long long a, long long b = p - 2, long long ans = 1) {
  for (; b; b >>= 1, a = a * a % p)
    if (b & 1) ans = ans * a % p;
  return ans;
}
void dfs(long long x, long long fa) {
  sz[x] = 1;
  mx[x] = 0;
  for (long long y, i = head[x]; (y = e[i].to); i = e[i].nxt)
    if (y != fa and !v[y]) dfs(y, x), sz[x] += sz[y], mx[x] = max(mx[x], sz[y]);
  mx[x] = max(mx[x], sum - mx[x]);
  if (mx[x] <= mx[rt]) rt = x;
}
void dp(long long x, long long fa, long long d, long long dis, long long r,
        long long o) {
  dis = (dis * k + a[x]) % p;
  r = (r + a[x] * Pow[d++]) % p;
  s1[(p + m - dis) % p * inv[d] % p] += o;
  s2[r] += o;
  for (long long y, i = head[x]; (y = e[i].to); i = e[i].nxt)
    if (y != fa and !v[y]) dp(y, x, d, dis, r, o);
}
void cal(long long x, long long fa, long long d, long long dis, long long r) {
  dis = (dis * k + a[x]) % p;
  r = (r + a[x] * Pow[d++]) % p;
  long long now = (p + m - dis) % p * inv[d] % p;
  in[x] += s2[now];
  out[x] += s1[r];
  for (long long y, i = head[x]; (y = e[i].to); i = e[i].nxt)
    if (y != fa and !v[y]) cal(y, x, d, dis, r);
}
void cal(long long x) {
  s1.clear();
  s2.clear();
  s2[a[x]]++;
  s1[(p + m - a[x]) % p * inv[1] % p]++;
  for (long long y, i = head[x]; (y = e[i].to); i = e[i].nxt)
    if (!v[y]) dp(y, x, 1, a[x], a[x], 1);
  for (long long y, i = head[x]; (y = e[i].to); i = e[i].nxt)
    if (!v[y])
      dp(y, x, 1, a[x], a[x], -1), cal(y, x, 0, 0, 0),
          dp(y, x, 1, a[x], a[x], 1);
  in[x] += s2[m];
  out[x] += s1[0];
}
void solve(long long now) {
  v[now] = 1;
  cal(now);
  for (long long y, i = head[now]; (y = e[i].to); i = e[i].nxt)
    if (!v[y]) rt = 0, sum = sz[y], dfs(y, now), solve(rt);
}
signed main() {
  rd(n);
  rd(p);
  rd(k);
  rd(m);
  Pow[0] = inv[0] = 1;
  for (long long i = 1; i <= n; i++) rd(a[i]);
  for (long long x, y, v, i = 1; i < n; i++) rd(x), rd(y), add(x, y);
  for (long long i = 1; i <= n; i++)
    Pow[i] = Pow[i - 1] * k % p, inv[i] = Inv(Pow[i]);
  mx[0] = sum = n;
  dfs(1, 0);
  solve(rt);
  for (long long i = 1; i <= n; i++) {
    long long in1 = out[i], in0 = n - in1, out1 = in[i], out0 = n - out1;
    ans += in0 * in1 * 2 + out0 * out1 * 2 + in0 * out1 + in1 * out0;
  }
  cout << n * n * n - ans / 2;
}
