Pagini recente » Cod sursa (job #885675) | Cod sursa (job #3279163) | Cod sursa (job #3227903) | Borderou de evaluare (job #1186250) | Cod sursa (job #466407)
Cod sursa(job #466407)
#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 preec[MAXN];
int TARGET;
bool PROST;
char S[2000];
int nS[MAXN];
int IMOD;
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(){
int cval=TARGET;
int indice=0;
while (cval<=K){
++indice;
++cval;
}
--cval;
preec[indice]=cval;
for (int i=indice-1;i>0;--i){
--cval;
preec[i]=((long long)preec[i+1]*cval)%MOD;
}
IMOD=putere(preec[indice],MOD-2);
}
void get_dyn(int nod,int dad){
int produs=1;
int nfii=0;
for (lista* ceva=G[nod];ceva;ceva=ceva->urm){
int tom=ceva->nod;
if (tom!=dad){
++nfii;
get_dyn(tom,nod);
produs=((long long)produs*dyn[tom])%MOD;
}
}
int lsup=K-1;
if (nod==1) ++lsup;
int linf=lsup-nfii+1;
int cdist=linf-TARGET+1;
int imod=preec[cdist];
if (lsup<K)
imod=((long long)imod*IMOD)%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;
}