#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 100;
const int mod = 1e9 + 7;
vector<int> side[maxn];
int a[maxn];
long long s[maxn];
int cnt[maxn], tot[maxn];
bool f[maxn];
void dfs(int u, int fa) {
  s[u] = a[u];
  for (int i = (0), iend = (side[u].size() - 1); i <= iend; i++) {
    int v = side[u][i];
    if (v == fa) continue;
    dfs(v, u);
    s[u] += s[v];
  }
}
long long gcd(long long a, long long b) { return (!b) ? a : gcd(b, a % b); }
long long dp[maxn];
int main() {
  ios::sync_with_stdio(0);
  int n;
  cin >> n;
  for (int i = (1), iend = (n); i <= iend; i++) cin >> a[i];
  for (int i = (2), iend = (n); i <= iend; i++) {
    int p;
    cin >> p;
    side[i].push_back(p);
    side[p].push_back(i);
  }
  dfs(1, 0);
  for (int i = (1), iend = (n); i <= iend; i++)
    if (s[1] / gcd(s[1], s[i]) <= n) cnt[s[1] / gcd(s[1], s[i])]++;
  for (int i = (1), iend = (n); i <= iend; i++)
    for (int j = i; j <= n; j += i) tot[j] += cnt[i];
  for (int i = (1), iend = (n); i <= iend; i++)
    if (tot[i] == i) f[i] = 1;
  dp[1] = 1;
  for (int i = (1), iend = (n); i <= iend; i++) {
    dp[i] *= f[i];
    for (int j = 2 * i; j <= n; j += i) dp[j] = (dp[j] + dp[i]) % mod;
  }
  long long ans = 0;
  for (int i = (1), iend = (n); i <= iend; i++) ans = (ans + dp[i]) % mod;
  cout << ans;
  return 0;
}
