Cod sursa(job #466233)

Utilizator victor.ionescuIonescu Victor Cristian victor.ionescu Data 26 iunie 2010 12:23:03
Problema Colorare3 Scor 60
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.9 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define MOD 1000000007
#define MAXN 100010
using namespace std;
int N,K;
vector<int> G[MAXN];
int dyn[MAXN];
int partK[MAXN];
int preimd[MAXN];
int TARGET;
bool PROST;
char S[2000];
int nS[MAXN];



int putere(int numar,int put){

	int cnr=numar;

	int rez=1;

	for (int i=0;(1<<i)<=put;++i){
		if ((1<<i)&put) rez=((long long)rez*cnr)%MOD;
		cnr=((long long)cnr*cnr)%MOD;
	}

	return rez;
}

void get_precalc(){

	partK[0]=1;
	preimd[0]=1;

	int cval=TARGET;

	int indice=0;

	while (cval<=K){
		++indice;
		partK[indice]=((long long)partK[indice-1]*cval)%MOD;
		preimd[indice]=putere(partK[indice],MOD-2);
		++cval;
	}
}





void get_dyn(int nod,int dad){
	
	int produs=1;

	int nfii=nS[nod]-1;;
	for (vector<int>::iterator it=G[nod].begin();it!=G[nod].end();++it)
		if ((*it)!=dad){
			get_dyn(*it,nod);
			produs=((long long)produs*dyn[*it])%MOD;
		}

	int lsup=K-1;
	if (nod==1) { ++lsup; ++nfii; }

	int linf=lsup-nfii+1;

	int imod=preimd[linf-TARGET];
	imod=((long long)imod*partK[lsup-TARGET+1])%MOD;

	produs=((long long)produs*imod)%MOD;

	dyn[nod]=produs;
}







int main(){

	freopen("colorare3.in","r",stdin);
	freopen("colorare3.out","w",stdout);


	scanf("%d%d\n",&N,&K);
	memset(nS,0,sizeof(nS));

	for (int i=1;i<N;++i){
		int A,B;

		fgets(S+1,1000,stdin);

		A=0;
		int poz=1;
		while (S[poz]!=' '){
			A*=10;
			A+=(S[poz]-'0');
			++poz;
		}
		++poz;

		B=0;

		while (S[poz]>='0' && S[poz]<='9'){
			B*=10;
			B+=(S[poz]-'0');
			++poz;
		}

		G[A].push_back(B);
		G[B].push_back(A);
		++nS[A];
		++nS[B];
	}

	fclose(stdin);

	TARGET=K+10;

	PROST=false;

	for (int i=1;i<=N;++i){
		if (nS[i]>K) {
			PROST=true;
			break ;
		}
		int ctar=K-nS[i];

		if (ctar<TARGET) TARGET=ctar;
	}

	++TARGET;

	if (PROST==true){
		printf("%d\n",0);
		fclose(stdout);
		return 0;
	}

	get_precalc();

	get_dyn(1,0);

	printf("%d\n",dyn[1]);

	fclose(stdout);

	return 0;
}