Pagini recente » Cod sursa (job #2727103) | Cod sursa (job #144500) | Cod sursa (job #3289378) | Cod sursa (job #1063023) | Cod sursa (job #374981)
Cod sursa(job #374981)
/*
* Complexity: O(N)
*/
#include <vector>
#include <fstream>
#include <cassert>
using namespace std;
const long long MOD = 1000000007;
int N, K;
vector < vector <int> > G;
int A(int n, int k) {
long long total = 1;
for (int i = n - k + 1; i <= n; ++i)
total = (total * i) % MOD;
return total;
}
int solve(int v, int f) {
long long result = 1;
for (vector <int> :: iterator it = G[v].begin(); it != G[v].end(); ++it)
if (*it != f)
result = (result * solve(*it, v)) % MOD;
if (v == 0)
result = (result * A(K, (int) G[v].size())) % MOD;
else
result = (result * A(K - 1, (int) G[v].size() - 1)) % MOD;
return result;
}
int main(int argc, char **argv) {
ifstream in; ofstream out;
if (argc == 3)
in.open(argv[1]), out.open(argv[2]);
else
in.open("colorare3.in"), out.open("colorare3.out");
in >> N >> K;
assert(1 <= N && N <= 100000);
assert(1 <= K && K <= 1000000000);
G.resize(N);
for (int i = 0, a, b; i < N - 1; ++i) {
in >> a >> b;
assert(1 <= a && a <= N && 1 <= b && b <= N && a != b);
G[a - 1].push_back(b - 1);
G[b - 1].push_back(a - 1);
}
out << solve(0, -1) << "\n";
return 0;
}