結果
問題 | No.827 総神童数 |
ユーザー | coco18000 |
提出日時 | 2019-05-03 23:18:18 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,519 bytes |
コンパイル時間 | 1,827 ms |
コンパイル使用メモリ | 177,188 KB |
実行使用メモリ | 25,600 KB |
最終ジャッジ日時 | 2024-06-10 07:08:55 |
合計ジャッジ時間 | 5,898 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 6 ms
16,640 KB |
testcase_01 | AC | 5 ms
11,336 KB |
testcase_02 | AC | 5 ms
11,264 KB |
testcase_03 | AC | 5 ms
11,392 KB |
testcase_04 | AC | 6 ms
11,392 KB |
testcase_05 | AC | 5 ms
11,328 KB |
testcase_06 | AC | 5 ms
11,208 KB |
testcase_07 | AC | 5 ms
11,264 KB |
testcase_08 | AC | 5 ms
11,264 KB |
testcase_09 | TLE | - |
testcase_10 | -- | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
testcase_16 | -- | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
testcase_21 | -- | - |
testcase_22 | -- | - |
testcase_23 | -- | - |
testcase_24 | -- | - |
testcase_25 | -- | - |
testcase_26 | -- | - |
testcase_27 | -- | - |
testcase_28 | -- | - |
testcase_29 | -- | - |
testcase_30 | -- | - |
testcase_31 | -- | - |
testcase_32 | -- | - |
testcase_33 | -- | - |
testcase_34 | -- | - |
testcase_35 | -- | - |
testcase_36 | -- | - |
testcase_37 | -- | - |
testcase_38 | -- | - |
ソースコード
#include <bits/stdc++.h> using namespace std; typedef long long int ll; typedef pair<ll, ll> pll; #define FOR(i, n, m) for (ll(i) = (m); (i) < (n); ++(i)) #define REP(i, n) FOR(i, n, 0) #define OF64 std::setprecision(10) const ll MOD = 1000000007; const ll INF = (ll)1e15; struct Combination { void init(ll n) { mNumTbl.resize(n + 1); mInverseNumTbl.resize(n + 1); mNumTbl[0] = 1; mInverseNumTbl[0] = 1; FOR(i, n + 1, 1) { mNumTbl[i] = (mNumTbl[i - 1] * i) % MOD; } FOR(i, n + 1, 1) { mInverseNumTbl[i] = modpow(mNumTbl[i]); } } ll get(ll n, ll r) { if (n < r || n < 0) return 0; return (((mNumTbl[n] * mInverseNumTbl[r]) % MOD) * mInverseNumTbl[n - r]) % MOD; } //! バイナリ方で累乗を計算 ll modpow(ll n) { ll s = 1, p = n; for (ll i = 0; (1 << i) <= MOD - 2; ++i, p = (p * p) % MOD) { if (((MOD - 2) & (1 << i)) == 0) continue; s *= p; s %= MOD; } return s; } vector<ll> mInverseNumTbl; vector<ll> mNumTbl; }; struct Vertex { vector<int> n; ll depth = INF; }; Vertex V[200005]; ll dp[200005]; ll N; Combination cmb; ll get(int n) { int d = V[n].depth; ll c = 0; FOR(i, N + 1, 1) { c += cmb.get(i - 1, d); c %= MOD; } return (((dp[d] * c) % MOD) * dp[N - 1 - d]) % MOD; } int main() { cin >> N; REP(i, N - 1) { int a, b; cin >> a >> b; a--; b--; V[a].n.push_back(b); V[b].n.push_back(a); } queue<pll> q; q.push(pll(0, 0)); while (!q.empty()) { pll t = q.front(); q.pop(); V[t.first].depth = t.second; int nd = t.second + 1; REP(i, V[t.first].n.size()) { int n = V[t.first].n[i]; if (nd >= V[n].depth) continue; q.push(pll(n, nd)); } } ll t = 1; memset(dp, 0, sizeof(dp)); cmb.init(N + 1); FOR(i, N + 1, 1) { t = (t * i) % MOD; dp[i] = t; } dp[0] = 1; // for (int i = N - 1; i >= 0; --i) // { // dp[i] += dp[i + 1]; // dp[i] %= MOD; // } // dp[0] = (t * N) % MOD; ll ans = 0; REP(i, N) { ans += get(i); //dp[V[i].depth]; ans %= MOD; } cout << ans << endl; return 0; }