/* * */ // 在 k<=0 的时候返回 1 ll binpow(ll a, ll k, const ll &p = mod){ ll res = 1; a %= p; while (k > 0) { if ((k & 1) == 1) res = a * res % p; a = a * a % p; k >>= 1; } return res; }
voidSolve(){ ll N; cin >> N; vector<ll> A(N + 2); for (int i = 1; i <= N; ++i) { cin >> A[i]; } ll cnt_op = count(all(A), -1); vector<vector<ll> > op_val_cnt(cnt_op + 2, vector<ll>(N + 2)); ll tot_num = 1; do { ll opc = 0, numc = 0; vector<ll> cnt(N + 2); for (int i = 1; i <= N; ++i) { if (A[i] == -1) { tot_num *= (numc - opc); tot_num %= mod; opc++; op_val_cnt[opc] = cnt; } else { cnt[A[i]]++; numc++; } } } while (false); vector<vector<ll> > dp_val_cnt(N + 2); vector<ll> dpacc_val(N + 2); for (ll op = 1; op <= cnt_op; ++op) { vector<ll> vals; for (int val = 0; val <= N; ++val) { if (op_val_cnt[op][val] >= 1) { vals.push_back(val); } } if (op == 1) { for (auto val: vals) { dp_val_cnt[val].resize(2); dp_val_cnt[val][1] = op_val_cnt[op][val]; dpacc_val[val] = op_val_cnt[op][val]; } } else { vector<vector<ll> > ndp_val_cnt(N + 2); vector<ll> ndpacc_val(N + 2); vector<ll> presum_dpacc(N + 2); partial_sum(all(dpacc_val), presum_dpacc.begin(), [](ll a, ll b) { return (a + b) % mod; }); for (auto val: vals) { ll val_cnt = op_val_cnt[op][val]; ndp_val_cnt[val].resize(min(op, val_cnt) + 2); for (int cnt = 1; cnt <= min(op, val_cnt); ++cnt) { ll rem_val = val_cnt - cnt + 1; if (cnt >= 2) { if (cnt - 1 > SZ(dp_val_cnt[val]) - 1) { break; } ndp_val_cnt[val][cnt] = rem_val * dp_val_cnt[val][cnt - 1]; ndp_val_cnt[val][cnt] %= mod; } else { // for (int s_val = 0; s_val < val; ++s_val) { // ndp_val_cnt[val][cnt] += dpacc_val[s_val]; // ndp_val_cnt[val][cnt] %= mod; // } if (val - 1 >= 0) { ndp_val_cnt[val][cnt] = presum_dpacc[val - 1]; } ndp_val_cnt[val][cnt] *= rem_val; ndp_val_cnt[val][cnt] %= mod; } ndpacc_val[val] += ndp_val_cnt[val][cnt]; ndpacc_val[val] %= mod; } } swap(dp_val_cnt, ndp_val_cnt); swap(dpacc_val, ndpacc_val); } } ll tot_dp_cnt = 0; for (int val = 0; val <= N; ++val) { for (int cnt = 1; cnt < SZ(dp_val_cnt[val]); ++cnt) { tot_dp_cnt += dp_val_cnt[val][cnt]; tot_dp_cnt %= mod; } } ll ans = tot_dp_cnt * binpow(tot_num, mod - 2); ans %= mod; cout << ans << "\n"; // #ifdef LOCAL // debug(tot_dp_cnt); // debug(tot_num); // debug2d(dp_val_cnt); // #endif
// mod }
signedmain(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); #ifdef LOCAL cout.setf(ios::unitbuf); // 无缓冲流,方便我们调试 #endif