#include <bits/stdc++.h>
using namespace std;
int gi() {
  int res = 0, w = 1;
  char ch = getchar();
  while (ch != '-' && !isdigit(ch)) ch = getchar();
  if (ch == '-') w = -1, ch = getchar();
  while (isdigit(ch)) res = res * 10 + ch - '0', ch = getchar();
  return res * w;
}
const int Mod = 1e9 + 7, K = 1e9;
int upd(int x) { return x + (x >> 31 & Mod); }
const int MAX_N = 3e5 + 5;
int N, M, a[MAX_N], b[MAX_N], c[MAX_N];
char s[MAX_N];
int d[MAX_N], m;
void Div(int x, int &v) {
  long long now = 0;
  for (int i = m; i; i--) {
    now = now * K + d[i];
    d[i] = now / x, now %= x;
  }
  v = now;
  for (; m > 1 && !d[m]; m--)
    ;
}
int f[2][MAX_N * 20], mx[2];
void add(int o, int x, int v) {
  f[o][x] = upd(f[o][x] + v - Mod);
  mx[o] = max(mx[o], x);
}
int main() {
  N = gi();
  a[1] = 1;
  for (int i = 2; i <= N; i++) a[i] = gi();
  for (int i = 1; i <= N; i++) b[i] = gi();
  scanf("%s", s + 1), M = strlen(s + 1);
  reverse(&s[1], &s[M + 1]);
  for (int i = 1; i <= M; i += 9) {
    ++m;
    for (int j = min(M, i + 8); j >= i; j--) d[m] = d[m] * 10 + s[j] - '0';
  }
  a[N + 1] = K;
  for (int i = 1; i <= N; i++)
    if (a[i + 1] > 1) Div(a[i + 1], c[i]);
  if (m != 1 || d[1] != 0) return puts("0") & 0;
  f[0][0] = 1, f[0][1] = Mod - 1, mx[0] = 1;
  for (int i = 1, o = 0; i <= N; i++, o ^= 1) {
    for (int j = 1; j <= mx[o]; j++) f[o][j] = upd(f[o][j] + f[o][j - 1] - Mod);
    for (int j = 0; j <= mx[o]; j++)
      if (f[o][j]) {
        int k = (c[i] - j % a[i + 1] + a[i + 1]) % a[i + 1];
        int l = (j + k - c[i]) / a[i + 1],
            r = b[i] / a[i + 1] + 1 - (b[i] % a[i + 1] < k);
        add(o ^ 1, l, f[o][j]), add(o ^ 1, l + r, Mod - f[o][j]);
        f[o][j] = 0;
      }
    mx[o] = 0;
  }
  printf("%d\n", f[N & 1][0]);
  return 0;
}
