#include <bits/stdc++.h>
using namespace std;
struct P {
  long long x;
  long long y;
  bool operator<(const P &a) const { return y > a.y; }
};
vector<long long> v[3];
int a, c, i, b, n, m, k, d;
long long o[1333331];
int l[1111111];
int j[1111115];
int e[1111111];
int dx[10] = {0, 1, 0, -1, 1, 1, -1, -1}, dy[10] = {1, 0, -1, 0, 1, -1, 1, -1},
    dz[10] = {0, 0, 0, 0, 1, -1};
long long x, y, mod = 1000000007, mod2 = 1000000009, mod3 = 2017;
long long z;
double pi = 3.14159265;
P u[1];
queue<int> q;
bool as(P a, P b) {
  if (a.x != b.x) return a.x < b.x;
  return a.y < b.y;
}
long long f(long long a, long long b) {
  for (; b;) {
    long long h = a;
    a = b;
    b = h % b;
  }
  return a;
}
int main() {
  scanf("%d", &a);
  for (int t = 1; t <= a; t++) scanf("%lld", &o[t]);
  for (int t = 2; t <= a; t++) scanf("%d", &l[t]);
  for (int t = a; t > 0; t--) o[l[t]] += o[t];
  for (int t = a; t > 0; t--)
    if (o[1] / f(o[1], o[t]) <= a) {
      j[o[1] / f(o[1], o[t])]++;
    }
  for (int t = a; t > 0; t--) {
    for (int h = t * 2; h <= a; h += t) j[h] += j[t];
  }
  for (int t = 1; t <= a; t++)
    if (j[t] >= t) e[t] = 1;
  for (int t = a; t > 0; t--)
    if (e[t]) {
      for (int h = t * 2; h <= a; e[t] %= mod, h += t) e[t] += e[h];
    }
  printf("%d ", e[1]);
}
