#include <bits/stdc++.h>
using namespace std;
struct edge {
  int u, v;
  edge *next;
} egp[1000005], *h[1000005];
int egcnt = 0;
void addedge(int u, int v) {
  edge *n1 = &egp[egcnt++];
  n1->u = u, n1->v = v, n1->next = h[u], h[u] = n1;
}
long long sz[1000005];
int p[1000005];
int dp[1000005];
bool fl[1000005];
void dfs(int a) {
  sz[a] = p[a];
  for (edge *p = h[a]; p; p = p->next) {
    dfs(p->v);
    sz[a] += sz[p->v];
  }
}
long long lst[1000005];
int f[1000005];
int n;
int check(int i) {
  long long x = sz[1] / i;
  for (int i = 1; i <= n; i++) lst[i] = 0;
  for (int i = n; i >= 1; i--) {
    lst[i] += p[i];
    if (lst[i] > x) return 0;
    if (lst[i] < x) lst[f[i]] += lst[i];
  }
  return 1;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &p[i]);
  for (int i = 2; i <= n; i++) {
    scanf("%d", &f[i]);
    addedge(f[i], i);
  }
  dfs(1);
  for (int i = 1; i <= n; i++) {
    if (sz[1] % sz[i]) continue;
    if (sz[1] / sz[i] <= n) fl[sz[1] / sz[i]] = 1;
  }
  for (int i = n; i >= 1; i--)
    if (!fl[i])
      continue;
    else {
      if (check(i)) dp[i] = 1;
    }
  for (int i = n; i >= 1; i--)
    if (dp[i])
      for (int j = 2 * i; j <= n; j += i) dp[i] = (dp[i] + dp[j]) % 1000000007;
  printf("%d\n", dp[1]);
  return 0;
}
