#include <bits/stdc++.h>
using namespace std;
int a[1000000];
int p[1000000];
vector<int> adjList[1000000];
long long int size[1000000];
long long int gcd(long long int a, long long int b) {
  long long int t;
  while (a > 0) t = b % a, b = a, a = t;
  return b;
}
vector<pair<long long int, long long int> > f;
vector<long long int> factors;
vector<long long int> seen;
int getFactors(int c, long long int x) {
  if (c == f.size()) {
    factors.push_back(x);
    return 0;
  }
  int i;
  for (i = 0; i <= f[c].second; i++) {
    getFactors(c + 1, x);
    if (i < f[c].second) x *= f[c].first;
  }
  return 0;
}
vector<int> num;
vector<long long int> poss, dp;
int main() {
  int i;
  int n;
  scanf("%d", &n);
  for (i = 0; i < n; i++) scanf("%d", &a[i]);
  for (i = 1; i < n; i++) scanf("%d", &p[i]), adjList[--p[i]].push_back(i);
  int j;
  for (i = n - 1; i >= 0; i--) {
    size[i] += a[i];
    if (i > 0) size[p[i]] += size[i];
    seen.push_back(size[i]);
  }
  sort(seen.begin(), seen.end());
  long long int x = size[0];
  for (i = 2; (long long int)i * i <= x; i++) {
    if ((x % i) == 0) {
      int c = 0;
      while ((x % i) == 0) x /= i, c++;
      f.push_back(make_pair(i, c));
    }
  }
  if (x > 1) f.push_back(make_pair(x, 1));
  getFactors(0, 1);
  sort(factors.begin(), factors.end()), num.resize(factors.size());
  for (i = 0; i < n; i++) {
    long long int g = gcd(size[0], size[i]);
    num[lower_bound(factors.begin(), factors.end(), g) - factors.begin()]++;
  }
  for (i = 0; i < factors.size(); i++) {
    if (size[0] / factors[i] > n) continue;
    if (binary_search(seen.begin(), seen.end(), factors[i])) {
      int c = 0;
      for (j = 0; j < factors.size(); j++) {
        if ((factors[j] % factors[i]) == 0) c += num[j];
      }
      if (c == size[0] / factors[i]) poss.push_back(factors[i]);
    }
  }
  sort(poss.begin(), poss.end()), dp.resize(poss.size());
  for (i = 0; i < poss.size(); i++) {
    dp[i] = 1;
    for (j = 0; j < i; j++) {
      if ((poss[i] % poss[j]) == 0) {
        dp[i] += dp[j];
        if (dp[i] >= 1000000007) dp[i] -= 1000000007;
      }
    }
  }
  printf("%d\n", dp.back());
  return 0;
}
