#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
const long long INF = 1e9 + 19;
const int SZ = 9;
const long long BASE = 1e9;
const int MOD = 1e9 + 7;
int n;
int a[N];
int b[N];
char s[N];
long long g[N];
long long val[N];
vector<int> cnt[N];
int step[N];
int cof[N];
void read() {
  scanf("%d", &n);
  for (int i = 0; i < n - 1; i++) scanf("%d", &a[i]);
  for (int i = 0; i < n; i++) scanf("%d", &b[i]);
  scanf("%s", s);
}
void solve() {
  int cur = 0;
  int len = strlen(s);
  for (; cur * SZ < len; cur++) {
    int u = min(len - cur * SZ, SZ);
    for (int i = 0; i < u; i++) {
      int pos = len - cur * SZ - u + i;
      g[cur] = g[cur] * 10 + s[pos] - '0';
    }
  }
  int m = 0;
  for (int i = 0; i < n;) {
    int j = i;
    for (; i + 1 < n && a[i] == 1; i++)
      ;
    i++;
    for (; j < i; j++) cnt[m].push_back(b[j]);
    if (i < n) {
      step[m] = a[i - 1];
    }
    m++;
  }
  long long sumCoin = 0;
  for (int i = 0; i < n; i++) sumCoin += b[i];
  for (int i = 0; i < m; i++) {
    long long rem = 0;
    if (i + 1 == m) {
      for (int j = cur - 1; j >= 0; j--) {
        rem = rem * BASE + g[j];
        if (rem > sumCoin) {
          puts("0");
          return;
        }
      }
    } else {
      for (int j = cur - 1; j >= 0; j--) {
        rem *= BASE;
        rem += g[j];
        g[j] = rem / step[i];
        rem = rem % step[i];
      }
    }
    cof[i] = rem;
    for (; cur > 0 && g[cur - 1] == 0; cur--)
      ;
  }
  vector<int> prev;
  prev.push_back(1);
  for (int i = 0; i < m; i++) {
    vector<vector<int>> dp(cnt[i].size() + 1);
    dp[0] = prev;
    for (int j = 0; j < (int)cnt[i].size(); j++) {
      int sz = dp[j].size() + cnt[i][j];
      dp[j + 1].resize(sz + 1);
      vector<int> pref(dp[j].size() + 1);
      for (int t = 0; t < (int)dp[j].size(); t++) {
        pref[t + 1] = (pref[t] + dp[j][t]) % MOD;
      }
      for (int t = 0; t < sz; t++) {
        int l = max(0, t - cnt[i][j]);
        int r = min((int)dp[j].size(), t + 1);
        dp[j + 1][t] = (pref[r] - pref[l] + MOD) % MOD;
      }
    }
    if ((int)dp.back().size() <= cof[i]) {
      puts("0");
      return;
    }
    if (i + 1 != m) {
      prev.clear();
      for (int t = cof[i]; t < (int)dp.back().size(); t += step[i])
        prev.push_back(dp.back()[t]);
    } else {
      printf("%d\n", dp.back()[cof[i]]);
    }
  }
}
void stress() {}
int main() {
  if (1) {
    read();
    solve();
  } else {
    stress();
  }
  return 0;
}
