#include <bits/stdc++.h>
using namespace std;
const int N = 300005;
const int P = 1e9 + 7;
int Pow(int x, int y, int P) {
  int an = 1;
  for (; y; y >>= 1, x = (long long)x * x % P)
    if (y & 1) an = (long long)an * x % P;
  return an;
}
void renew(int &x, const int &y) {
  x += y;
  if (x >= P) x -= P;
  if (x < 0) x += P;
}
int n, a[N], b[N], SZ, PSZ;
int dp[N], pdp[N], res[N];
const int mod = 10000;
struct Bigint {
  int a[3005], len;
  void read() {
    static char s[10005];
    scanf("%s", s);
    int buflen = strlen(s);
    len = 0;
    memset(a, 0, sizeof a);
    for (int i = (int)buflen - 1; i >= (int)0; i--) {
      ++len;
      for (int j = (int)3; j >= (int)0; j--) {
        if (i < j) continue;
        a[len] *= 10;
        a[len] += s[i - j] - 48;
      }
      i -= 3;
    }
  }
  int div(int x) {
    if (x == 1) return 0;
    long long res = 0;
    for (int i = (int)len; i >= (int)1; i--) {
      res = res * 10000 + a[i];
      a[i] = res / x;
      res = res % x;
    }
    while (len && a[len] == 0) --len;
    return res;
  }
  long long getval() {
    long long res = 0;
    for (int i = (int)len; i >= (int)1; i--) {
      res = res * 10000 + a[i];
      if (res > 300000) return -1;
    }
    return res;
  }
} Big;
int main() {
  scanf("%d", &n);
  for (int i = (int)2; i <= (int)n; i++) scanf("%d", a + i);
  for (int i = (int)1; i <= (int)n; i++) scanf("%d", b + i);
  Big.read();
  SZ = b[1] + 1;
  for (int i = (int)0; i < (int)SZ; i++) dp[i] = 1;
  for (int i = (int)2; i <= (int)n; i++) {
    int rem = Big.div(a[i]);
    int stp = b[i] + 1;
    for (int i = (int)0; i < (int)SZ; i++) {
      pdp[i] = dp[i];
    }
    for (int i = (int)0; i <= (int)SZ + stp; i++) res[i] = dp[i] = 0;
    swap(SZ, PSZ);
    SZ = 0;
    for (int x = rem; x < PSZ; x += a[i]) {
      dp[SZ] = pdp[x];
      SZ++;
    }
    for (int x = 0; x < SZ; x++) {
      renew(res[x], dp[x]);
      renew(res[x + stp], -dp[x]);
    }
    for (int i = (int)0; i <= (int)SZ + stp; i++) renew(res[i], res[i - 1]);
    SZ += stp;
    for (int i = (int)0; i < (int)SZ; i++) dp[i] = res[i];
    if (!Big.len) break;
  }
  int now = Big.getval();
  if (now == -1 || now >= SZ)
    printf("%d\n", 0);
  else
    printf("%d\n", dp[now]);
  return 0;
}
