Pagini recente » preONI 2008 - Clasament general, Clasa a 10-a | Borderou de evaluare (job #2018306) | Cod sursa (job #3242423) | Cod sursa (job #560345) | Cod sursa (job #466227)
Cod sursa(job #466227)
#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 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;
}