Submission #6416919
Source Code Expand
// atcoder/tdpc/N/main.cpp
// author: @___Johniel
// github: https://github.com/johniel/
#include <bits/stdc++.h>
#define each(i, c) for (auto& i : c)
#define unless(cond) if (!(cond))
using namespace std;
typedef long long int lli;
typedef unsigned long long ull;
typedef complex<double> point;
template<typename P, typename Q> ostream& operator << (ostream& os, pair<P, Q> p) { os << "(" << p.first << "," << p.second << ")"; return os; }
template<typename P, typename Q> istream& operator >> (istream& is, pair<P, Q>& p) { is >> p.first >> p.second; return is; }
template<typename T> ostream& operator << (ostream& os, vector<T> v) { os << "("; each (i, v) os << i << ","; os << ")"; return os; }
template<typename T> istream& operator >> (istream& is, vector<T>& v) { each (i, v) is >> i; return is; }
template<typename T> inline T setmax(T& a, T b) { return a = std::max(a, b); }
template<typename T> inline T setmin(T& a, T b) { return a = std::min(a, b); }
const int N = 1000 + 5;
vector<int> g[N];
const lli mod = 1e9 + 7;
lli nck[N][N];
pair<lli, int> memo[N][N];
pair<lli, int> rec(int curr, int prev)
{
pair<lli, int>& ret = memo[curr][prev];
if (ret.second != -1) return ret;
vector<pair<lli, int>> v;
each (next, g[curr]) {
if (next == prev) continue;
v.push_back(rec(next, curr));
}
lli x = v.size();
each (i, v) x += i.second;
ret.second = x;
lli y = 1;
each (i, v) {
(y *= i.first) %= mod;
(y *= nck[x][i.second + 1]) %= mod;
x -= i.second + 1;
}
ret.first = y;
return ret;
}
int main(int argc, char *argv[])
{
ios_base::sync_with_stdio(0);
cin.tie(0);
fill(&nck[0][0], &nck[N - 1][N - 1] + 1, 0);
for (int i = 0; i < N; ++i) {
nck[i][i] = nck[i][0] = 1;
}
for (int i = 1; i < N; ++i) {
for (int j = 1; j < N; ++j) {
nck[i][j] = (nck[i - 1][j - 1] + nck[i - 1][j]) % mod;
}
}
int n;
while (cin >> n) {
fill(g, g + N, vector<int>());
fill(&memo[0][0], &memo[N - 1][N - 1] + 1, make_pair(-1, -1));
for (int i = 0; i < n - 1; ++i) {
int a, b;
cin >> a >> b;
--a;
--b;
g[a].push_back(b);
g[b].push_back(a);
}
lli x = 0;
for (int i = 0; i < n; ++i) {
each (j, g[i]) {
if (i < j) {
auto p = rec(i, j);
auto q = rec(j, i);
lli y = (p.first * q.first) % mod;
(y *= nck[p.second + q.second][p.second]) %= mod;
x += y;
}
}
}
cout << x << endl;
}
return 0;
}
Submission Info
Submission Time |
|
Task |
N - 木 |
User |
Johniel |
Language |
C++14 (GCC 5.4.1) |
Score |
0 |
Code Size |
2615 Byte |
Status |
WA |
Exec Time |
28 ms |
Memory |
24064 KB |
Judge Result
Set Name |
All |
Score / Max Score |
0 / 5 |
Status |
|
Set Name |
Test Cases |
All |
00, 01, 02, 03, 04, 05, 06, 90, 91 |
Case Name |
Status |
Exec Time |
Memory |
00 |
WA |
10 ms |
24064 KB |
01 |
WA |
28 ms |
24064 KB |
02 |
WA |
10 ms |
23936 KB |
03 |
WA |
10 ms |
23936 KB |
04 |
WA |
10 ms |
23936 KB |
05 |
WA |
10 ms |
23936 KB |
06 |
WA |
10 ms |
23936 KB |
90 |
AC |
10 ms |
23936 KB |
91 |
AC |
10 ms |
23936 KB |