結果
問題 | No.243 出席番号(2) |
ユーザー |
|
提出日時 | 2016-08-23 23:22:58 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 53 ms / 2,000 ms |
コード長 | 978 bytes |
コンパイル時間 | 830 ms |
コンパイル使用メモリ | 71,296 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-08 00:06:12 |
合計ジャッジ時間 | 1,944 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 |
ソースコード
#include <iostream> #include <vector> #define repeat(i,n) for (int i = 0; (i) < (n); ++(i)) #define repeat_reverse(i,n) for (int i = (n)-1; (i) >= 0; --(i)) typedef long long ll; using namespace std; const int mod = 1e9+7; int main() { // input int n; cin >> n; vector<int> a(n); repeat (i,n) cin >> a[i]; // prepare vector<ll> fact(n+1); fact[0] = 1; repeat (i,n) fact[i+1] = fact[i] * (i+1) % mod; // compute vector<int> cnt(n); repeat (i,n) { if (a[i] < n) { cnt[a[i]] += 1; } } vector<ll> dp(n+1); dp[0] = 1; repeat (i,n) if (cnt[i]) { repeat_reverse (k,n) { dp[k+1] += dp[k] * cnt[i] % mod; dp[k+1] %= mod; } } ll ans = fact[n]; repeat (k,n) { ans += dp[k+1] * fact[n-(k+1)] % mod * ((k+1) % 2 == 1 ? -1 : 1) % mod; ans %= mod; } ans += mod; ans %= mod; // output cout << ans << endl; return 0; }