Cod sursa(job #466184)

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


void preprocesare_minim(int nod,int dad){

	int nsons=0;

	for (vector<int>::iterator it=G[nod].begin();it!=G[nod].end();++it)
		if ((*it)!=dad){
			++nsons;
			preprocesare_minim(*it,nod);
		}

	int ctar=K-1;

	if (nod==1) ++ctar;

	if (nsons>ctar) PROST=true;

	ctar-=nsons;
	ctar++;

	if (ctar<TARGET) TARGET=ctar;
}


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;

	int cval=TARGET;

	int indice=0;

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





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

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

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

	int linf=lsup-nfii+1;

	int dist1=lsup-TARGET+1;
	int dist2=linf-TARGET+1;

	int imod=putere(partK[dist2-1],MOD-2);
	imod=((long long)imod*partK[dist1])%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);

	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);
	}

	fclose(stdin);

	TARGET=K+10;

	PROST=false;
	preprocesare_minim(1,0);

	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;
}