#include <bits/stdc++.h>
using namespace std;
void sc(int& x) {
  x = 0;
  char c = getchar();
  while (c > '9' || c < '0') c = getchar();
  for (; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - '0';
}
const int N = 3e5 + 7;
const int mod = 1e9 + 7;
void upd(int& x, int y) {
  x += y;
  if (x >= mod) x -= mod;
  if (x < 0) x += mod;
}
int a[N], b[N], n, len, f[2][N << 1], sz[2], num[N], now = 0;
char s[N];
int dvd(int x) {
  if (x == 1) return 0;
  int yv = 0, cc = 1e9;
  for (int i = len; i >= 0; i--) {
    long long tmp = num[i] + 1ll * yv * cc;
    num[i] = tmp / x;
    yv = tmp % x;
  }
  while (len >= 0 && !num[len]) len--;
  return yv;
}
int main() {
  sc(n);
  a[1] = 1;
  for (int i = 2; i <= n; i++) sc(a[i]);
  for (int i = 1; i <= n; i++) sc(b[i]);
  scanf("%s", s);
  len = strlen(s);
  for (int i = 0; i * 9 < len; i++) {
    int l = i * 9, r = min(len, (i + 1) * 9) - 1;
    for (int j = r; j >= l; j--) num[i] = num[i] * 10 + s[len - j - 1] - '0';
  }
  len = (len - 1) / 9;
  f[now][0] = 1;
  for (int i = 1; i <= n; i++) {
    int yv = dvd(a[i]);
    sz[now ^ 1] = 0;
    for (int j = yv; j <= sz[now]; j += a[i], sz[now ^ 1]++)
      f[now ^ 1][sz[now ^ 1]] = f[now][j];
    sz[now] = sz[now ^ 1] + b[i] - 1;
    int res = 0;
    for (int j = 0; j <= sz[now]; j++) {
      if (sz[now ^ 1] > j) upd(res, f[now ^ 1][j]);
      if (j > b[i] && sz[now ^ 1] > j - b[i] - 1)
        upd(res, -f[now ^ 1][j - b[i] - 1]);
      f[now][j] = res;
    }
  }
  long long need = 0;
  for (int i = len; i >= 0; i--) {
    need = need * 1e9 + num[i];
    if (need > sz[now]) {
      puts("0");
      return 0;
    }
  }
  printf("%d\n", f[now][need]);
}
