func_code_string: #include <bits/stdc++.h>   #pragma comment(linker,  /STACK:36777216 )   using namespace std;   long long pow_mod(long long x, long long y, long long z) {     long long res = 1;     while (y) {       if (y & 1) res *= x, res %= z;       x *= x, x %= z, y >>= 1;     }     return res % z;   }   void ext_gcd(long long a, long long b, long long &d, long long &x,                long long &y) {     if (!b) {       d = a, x = 1, y = 0;     } else {       ext_gcd(b, a % b, d, y, x), y -= x * (a / b);     }   }   long long inv(long long a, long long c) {     long long d, x, y;     ext_gcd(a, c, d, x, y);     return (x + c) % c;   }   long long fac[111111];   long long C(int x, int y) {     if (x < y) return 0;     return fac[x] * inv(fac[y], 1000000007) % 1000000007 *            inv(fac[x - y], 1000000007) % 1000000007;   }   int n, v;   vector<pair<int, int> > vec;   long long gao(int l, int r, int pre) {     if (l < 1) return 0;     if (r > n) return 0;     long long res;     if (pre == 1)       res = 1;     else       res = pow_mod(2, pre - 2, 1000000007);     for (int i = 1; i < vec.size(); i++) {       if (vec[i].second > r) {         res *= C(vec[i].first - pre - 1, vec[i].second - r - 1);         res %= 1000000007;         if (res == 0) return 0;         l = l - (vec[i].first - pre - 1 - (vec[i].second - r - 1));         r = vec[i].second;       } else if (vec[i].second < l) {         res *= C(vec[i].first - pre - 1, l - vec[i].second - 1);         res %= 1000000007;         if (res == 0) return 0;         r = r + (vec[i].first - pre - 1 - (l - vec[i].second - 1));         l = vec[i].second;       } else         return 0;       if (i == vec.size() - 1) return res;       if (r > n || l < 1) return 0;       pre = vec[i].first;     }     return res;   }   int main() {     fac[0] = 1;     for (int i = 1; i <= 100000; i++) fac[i] = fac[i - 1] * i % 1000000007;     scanf( %d , &n);     for (int i = 1; i <= n; i++) {       scanf( %d , &v);       if (v) vec.push_back(make_pair(v, i));     }     if (vec.size() == 0) {       printf( %I64d n , pow_mod(2, n - 1, 1000000007));       return 0;     }     vec.push_back(make_pair(n + 1, n + 1));     sort(vec.begin(), vec.end());     long long ans;     if (vec[0].first == 1)       ans = gao(vec[0].second, vec[0].second, 1);     else       ans = gao(vec[0].second - vec[0].first + 1, vec[0].second, vec[0].first) +             gao(vec[0].second, vec[0].second + vec[0].first - 1, vec[0].first) %                 1000000007;     printf( %I64d n , ans);   }   