#include <bits/stdc++.h>
using namespace std;
struct Modint {
  static const int MOD = 1000000007;
  int val;
  Modint(int nval = 0) { val = nval; }
  Modint& operator+=(Modint r) {
    val = (val + r.val) % MOD;
    return *this;
  }
  Modint operator+(Modint r) { return Modint(*this) += r; }
  Modint& operator-=(Modint r) {
    val = (val + MOD - r.val) % MOD;
    return *this;
  }
  Modint operator-(Modint r) { return Modint(*this) -= r; }
  Modint& operator*=(Modint r) {
    val = 1LL * val * r.val % MOD;
    return *this;
  }
  Modint operator*(Modint r) { return Modint(*this) *= r; }
};
struct Bignum {
  static const int MOD = 1000000000;
  vector<int> data;
  Bignum(string s) {
    while (s.size() > 0) {
      int l = max((int)s.size() - 9, 0);
      data.push_back(stoi(s.substr(l, 9)));
      s.resize(l);
    }
  }
  Bignum() = default;
  pair<Bignum, int> div(int val) {
    Bignum d;
    d.data.resize(data.size(), 0);
    long long r = 0;
    for (int i = (int)data.size() - 1; i >= 0; i--) {
      r *= MOD;
      r += data[i];
      d.data[i] = r / val;
      r = r % val;
    }
    while (d.data.size() > 0 && d.data.back() == 0) d.data.pop_back();
    return {d, int(r)};
  }
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n;
  cin >> n;
  vector<int> a(n - 1);
  for (int i = 0; i < n - 1; i++) cin >> a[i];
  vector<int> b(n);
  for (int i = 0; i < n; i++) cin >> b[i];
  string m;
  cin >> m;
  vector<int> lim(n, 0);
  for (int i = 0; i < n; i++) {
    lim[i] += b[i];
    if (i < n - 1) lim[i + 1] += lim[i] / a[i];
  }
  vector<int> r(n, 0);
  {
    Bignum val(m);
    int l = 0, d = 1;
    for (int i = 0; i < n; i++) {
      if (i == n - 1 || d > 1000000000 / a[i]) {
        pair<Bignum, int> ret = val.div(d);
        r[l] = ret.second;
        val = ret.first;
        l = i;
        d = 1;
      }
      if (i < n - 1) d *= a[i];
    }
    if (val.data.size() == 0)
      r[n - 1] = 0;
    else if (val.data.size() > 1 || val.data[0] > lim[n - 1]) {
      cout << "0\n";
      return 0;
    } else
      r[n - 1] = val.data[0];
    for (int i = 0; i < n - 1; i++) {
      r[i + 1] += r[i] / a[i];
      r[i] = r[i] % a[i];
    }
  }
  vector<Modint> dp(lim[n - 1] + 1, 0);
  dp[r[n - 1]] = 1;
  for (int lvl = n - 1; lvl > 0; lvl--) {
    vector<Modint> ndp(lim[lvl - 1] + 1, 0), add(lim[lvl - 1] + 1, 0);
    for (int x = 0; x <= lim[lvl]; x++)
      if (dp[x].val != 0) {
        int right = min(x, b[lvl]);
        long long addl = 1LL * (x - right) * a[lvl - 1] + r[lvl - 1];
        long long addr = 1LL * (x + 1) * a[lvl - 1] + r[lvl - 1];
        if (addl <= lim[lvl - 1]) add[addl] += dp[x];
        if (addr <= lim[lvl - 1]) add[addr] -= dp[x];
      }
    Modint cadd = 0;
    for (int i = r[lvl - 1]; i <= lim[lvl - 1]; i += a[lvl - 1]) {
      cadd += add[i];
      ndp[i] += cadd;
    }
    swap(dp, ndp);
  }
  Modint result = 0;
  for (int i = 0; i <= b[0]; i++) result += dp[i];
  cout << result.val << '\n';
  return 0;
}
