#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 7;
const int inf = INT_MAX;
const long long inff = 1e18;
const int mod = 1e9 + 7;
vector<int> G[maxn];
long long a[maxn], sum[maxn];
int canuse[maxn], dp[maxn];
vector<long long> values;
void dfs(int now) {
  sum[now] = a[now];
  for (int i : G[now]) dfs(i), sum[now] += sum[i];
}
inline int singlemod(int x, int y) {
  return x + y >= mod ? x + y - mod : x + y;
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 2; i <= n; i++) {
    int x;
    cin >> x;
    G[x].push_back(i);
  }
  dfs(1);
  for (int i = 1; i <= n; i++) values.push_back(sum[i]);
  sort((values).begin(), (values).end());
  for (int i = 1; i <= n; i++) {
    if (sum[1] / i * i != sum[1]) continue;
    long long basic = sum[1] / i;
    if ((*lower_bound((values).begin(), (values).end(), basic)) != basic)
      continue;
    int cnt = 0;
    for (int j = 1; j <= i; j++)
      cnt += (upper_bound((values).begin(), (values).end(), basic * j) -
              lower_bound((values).begin(), (values).end(), basic * j));
    if (cnt == i) canuse[i] = 1;
  }
  for (int i = n; i >= 1; i--) {
    if (!canuse[i]) continue;
    for (int j = i + i; j <= n; j += i)
      if (canuse[j]) dp[i] = singlemod(dp[i], dp[j]);
    dp[i] = singlemod(dp[i], 1);
  }
  cout << dp[1] << '\n';
}
