Cod sursa(job #374996)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 18 decembrie 2009 23:48:23
Problema Colorare3 Scor Ascuns
Compilator cpp Status done
Runda Marime 1.06 kb
#include <fstream>
#include <vector>

using namespace std;

#define PB push_back

typedef long long lint;

const int MOD = 1000000007;
const int NMAX = 100007;

int N, K, result = 1;
vector <int> G[NMAX];
int A[NMAX], A1[NMAX];

void read(void) {
	ifstream fin("colorare3.in");
	int i, a, b;

	fin >> N >> K;

	for (i = 1; i < N; ++i) {
		fin >> a >> b;
		G[a].PB(b);
		G[b].PB(a);
	}

	fin.close();
}

void DFS(int k, int t) {
	if (k == 1) {
		result = (lint) result * A1[ G[k].size() ] % MOD;
	} else {
		result = (lint) result * A[ G[k].size() - 1 ] % MOD;
	}

	int i;

	for (i = 0; i < (int) G[k].size(); ++i)
		if (G[k][i] != t)
			DFS(G[k][i], k);
}

void solve(void) {
	int i;

	A[0] = A1[0] = 1;
//	printf("0: %d %d\n", A[0], A1[0]);
	for	(i = 1; i <= N; ++i) {
		A[i] = ((lint) A[i-1] * (K - i)) % MOD;
		A1[i] = ((lint) A1[i-1] * (K - i + 1)) % MOD;

//		printf("%d: %d %d\n", i, A[i], A1[i]);
	}

	DFS(1, 0);
}

void write(void) {
	ofstream fout("colorare3.out");

	fout << result << '\n';

	fout.close();
}

int main(void) {

	read();

	solve();

	write();

	return 0;
}