#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007;
vector<long long> sil(100001);
long long Pot(long long p, long long w) {
  if (w == 0) return 1;
  if (w % 2 == 0) {
    long long pol = Pot(p, w / 2);
    return pol * pol % MOD;
  }
  return Pot(p, w - 1) * p % MOD;
}
long long Inv(long long n) { return Pot(n, MOD - 2); }
long long C(long long n, long long k) {
  return sil[n] * Inv(sil[k]) % MOD * Inv(sil[n - k]) % MOD;
}
long long Puste(long long n) {
  if (n == 0) return 1;
  long long w = 0;
  for (int i = 1; i <= n; ++i) w = (w + C(n - 1, i - 1)) % MOD;
  return w;
}
long long Licz(vector<int>& a, long long L, long long R, long long odp) {
  int n = a.size();
  vector<int> znane;
  for (int i = 0; i < n; ++i)
    if (a[i] != 0) znane.push_back(a[i]);
  sort(znane.begin(), znane.end());
  vector<int> lewo(n), prawo(n);
  lewo[0] = -1;
  for (int i = 1; i < n; ++i) {
    lewo[i] = lewo[i - 1];
    if (a[i - 1] != 0) lewo[i] = i - 1;
  }
  prawo[n - 1] = n;
  for (int i = n - 2; i >= 0; --i) {
    prawo[i] = prawo[i + 1];
    if (a[i + 1] != 0) prawo[i] = i + 1;
  }
  for (int i = 1; i < znane.size(); ++i) {
    if ((lewo[L] == -1 || a[lewo[L]] != znane[i]) &&
        (prawo[R] == n || a[prawo[R]] != znane[i]))
      return 0;
    long long musze = znane[i] - znane[i - 1] - 1;
    long long pusteL = L - lewo[L] - 1, pusteR = prawo[R] - R - 1;
    if (lewo[L] != -1 && a[lewo[L]] == znane[i]) {
      if (musze >= pusteL && musze <= pusteL + pusteR) {
        odp = (odp * C(musze, pusteL)) % MOD;
        L = lewo[L];
        R += musze - pusteL;
        continue;
      } else
        return 0;
    }
    if (prawo[R] != n && a[prawo[R]] == znane[i]) {
      if (musze >= pusteR && musze <= pusteL + pusteR) {
        odp = (odp * C(musze, pusteR)) % MOD;
        R = prawo[R];
        L -= musze - pusteR;
        continue;
      } else
        return 0;
    }
  }
  long long pusteL = L, pusteR = n - R - 1;
  odp = (odp * C(pusteL + pusteR, pusteL)) % MOD;
  return odp;
}
int main() {
  ios_base::sync_with_stdio(0);
  sil[0] = 1;
  for (long long i = 1; i < 100001; ++i) sil[i] = (sil[i - 1] * i) % MOD;
  int n;
  cin >> n;
  vector<int> a(n);
  for (int i = 0; i < n; ++i) cin >> a[i];
  int mini = -1;
  for (int i = 0; i < n; ++i)
    if (a[i] != 0 && (mini == -1 || a[i] < a[mini])) mini = i;
  if (mini == -1) {
    cout << Puste(n);
    return 0;
  }
  if (a[mini] == 1) {
    cout << Licz(a, mini, mini, 1);
    return 0;
  }
  bool okL = true;
  for (int i = 1; i <= a[mini] - 1; ++i)
    if (mini - i < 0 || a[mini - i] != 0) okL = false;
  bool okR = true;
  for (int i = 1; i <= a[mini] - 1; ++i)
    if (mini + i >= n || a[mini + i] != 0) okR = false;
  long long odp = 0;
  if (okL)
    odp = (odp + Licz(a, mini - a[mini] + 1, mini, Puste(a[mini] - 1))) % MOD;
  if (okR)
    odp = (odp + Licz(a, mini, mini + a[mini] - 1, Puste(a[mini] - 1))) % MOD;
  cout << odp;
  return 0;
}
