Cod sursa(job #374981)

Utilizator stef2nStefan Istrate stef2n Data 18 decembrie 2009 23:07:16
Problema Colorare3 Scor Ascuns
Compilator cpp Status done
Runda Marime 1.24 kb
/*
 *  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;
}