func_code_string: #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;   }   