Pagini recente » Cod sursa (job #3003216) | Cod sursa (job #2690615) | Cod sursa (job #911338) | Cod sursa (job #1889733) | Cod sursa (job #466271)
Cod sursa(job #466271)
#include <cstdio>
#include <cstring>
#define MOD 1000000007
#define MAXN 100010
using namespace std;
int N,K;
struct lista{
int nod;
lista* urm;
} *G[MAXN];
int dyn[MAXN];
int partK[MAXN];
int preimd[MAXN];
int TARGET;
bool PROST;
char S[2000];
int nS[MAXN];
inline 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 (lista* ceva=G[nod];ceva;ceva=ceva->urm){
int tom=ceva->nod;
if (tom!=dad){
get_dyn(tom,nod);
produs=((long long)produs*dyn[tom])%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));
memset(G,0,sizeof(G));
lista* Q;
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;
}
Q=new lista;
Q->nod=B;
Q->urm=G[A];
G[A]=Q;
Q=new lista;
Q->nod=A;
Q->urm=G[B];
G[B]=Q;
++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;
}