paste

#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;
}
posted @ 2025-11-20 15:27  Little_corn  阅读(4)  评论(0)    收藏  举报