#include<bits/stdc++.h>
#define ll long long
#define il inline
#define pir pair<ll, ll>
#define mkpir make_pair
#define umap unordered_map
#define pb emplace_back
#define fi first
#define se second
#define db double
using namespace std;
const int N = 5000 + 1, M = 2e5 + 10;
const ll INF = 1e18, mod = 1e9 + 7;
const db eps = 1e-9;
/*
struct edge{
int v, next;
}edges[M << 1];
int head[N], idx;
il void add_edge(int u, int v){
edges[++idx] = {v, head[u]};
head[u] = idx;
}
*/
il void chkmax(ll& x, ll y){if(x < y) x = y;}
il void chkmin(ll& x, ll y){if(x > y) x = y;}
il void chkmax(int& x, int y){if(x < y) x = y;}
il void chkmin(int& x, int y){if(x > y) x = y;}
il void ADD(ll& x, ll y){x += y; ((x >= mod) ? x -= mod : 0ll);}
il void MUL(ll& x, ll y){x = x * y % mod;}
il ll qpow(ll x, int y){
ll ret = 1;
for(; y; y >>= 1, MUL(x, x)) if(y & 1) MUL(ret, x);
return ret;
}
//#define int long long
ll f[N][N], fac[N];
int n, a[N];
bool cmp(int x, int y){return abs(x) < abs(y);}
signed main(){
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n; fac[0] = 1; int c = n;
for(int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % mod;
for(int i = 1; i <= n; i++){
cin >> a[i];
if(a[i] < 0) c--, a[i]++;
} sort(a + 1, a + n + 1, cmp);
f[0][0] = 1;
for(int i = 1; i <= n; i++){
for(int j = 0; j < i; j++){
if(a[i] <= 0){
ADD(f[i][j], f[i - 1][j]);
if(-a[i] - j > 0) ADD(f[i][j + 1], f[i - 1][j] * (-a[i] - j) % mod);
} else{
if(a[i] - j > 0) ADD(f[i][j + 1], f[i - 1][j] * (a[i] - j) % mod);
}
}
} ll ans = 0;
for(int i = c; i <= n; i++) ADD(ans, 1ll * (((i - c) & 1) ? (mod - 1) : 1ll) * f[n][i] % mod * fac[n - i] % mod);
cout << ans;
return 0;
}