結果
| 問題 | No.827 総神童数 | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2019-05-03 23:18:18 | 
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                TLE
                                 
                             | 
| 実行時間 | - | 
| コード長 | 2,519 bytes | 
| コンパイル時間 | 2,188 ms | 
| コンパイル使用メモリ | 177,416 KB | 
| 実行使用メモリ | 33,684 KB | 
| 最終ジャッジ日時 | 2024-12-31 19:12:10 | 
| 合計ジャッジ時間 | 84,989 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 9 TLE * 27 | 
ソースコード
#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;
}
            
            
            
        