#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <set>
#include <map>
#include <cassert>
#include <numeric>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
#ifdef LOCAL
#define eprintf(...) fprintf(stderr, __VA_ARGS__)
#else
#define eprintf(...) 42
#endif
typedef long long int int64;
const int MOD = (int) 1e9 + 7;
void sadd(int &a, int b)
{
a += b;
if (a >= MOD) a -= MOD;
}
int add(int a, int b)
{
sadd(a, b);
return a;
}
int mul(int a, int b)
{
return (a * 1LL * b) % MOD;
}
const int N = (int) 1e5 + 100;
int a[N];
int main(int, char **)
{
#ifdef LOCAL
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i] );
}
int cnt = 0;
int ans = 1;
for (int i = 0; i < n; i++)
{
int cur = a[i];
int good = 2 * cnt + 1;
if (cur >= good)
{
cnt++;
continue;
}
ans = mul(ans, cnt + 1);
}
for (int i = 1; i <= cnt; i++)
ans = mul(ans, i);
printf("%d\n", ans);
return 0;
}