Pagini recente » Cod sursa (job #466223) | Cod sursa (job #3184073) | Cod sursa (job #367307) | Cod sursa (job #507644) | Cod sursa (job #466210)
Cod sursa(job #466210)
#include <stdio.h>
#include <vector>
using namespace std;
#define MODULO 1000000007
#define MAXN 100005
int A[MAXN];
int F[MAXN];
int prod[MAXN];
int i,N,K,x,y;
long long inv,aux;
vector<int> G[MAXN];
char s[100];
int P[MAXN];
void df(int nod, int tata)
{
vector<int>::iterator it;
prod[nod] = 1;
for (it=G[nod].begin(); it!=G[nod].end(); ++it)
if (*it!=tata){
int fiu = *it;
++F[nod];
df(fiu, nod);
prod[nod] = (1LL * prod[nod] * (K-F[fiu])) % MODULO;
if (K<F[fiu]) { prod[nod]=0; return; }
prod[nod] = (1LL * prod[nod]*prod[fiu]) % MODULO;
}
prod[nod] = (1LL * prod[nod] * P[F[nod]]) % MODULO;
prod[nod] = (1LL * prod[nod] * A[F[nod]]) % MODULO;
}
inline void aranj()
{
A[0] = 1LL;
for (int i=1; i<=N && i<=K; ++i)
A[i] = (A[i-1]*(K-i+1)) % MODULO;
P[0] = 1LL;
for (int i=1; i<=N; ++i)
P[i] = (P[i-1]*inv) % MODULO;
}
void euclid(long long a, long long b, long long &x, long long &y)
{
if (b==0){
x=1; y=0;
}
else {
long long x0=0, y0=0;
euclid(b,a % b, x0, y0);
x=y0;
y=x0-(a/b)*y0;
}
}
int main()
{
freopen("colorare3.in","r",stdin);
freopen("colorare3.out","w",stdout);
scanf("%d %d\n",&N,&K);
euclid(K,MODULO,inv,aux);
while (inv<=0)
inv+=MODULO;
aranj();
for (i=1; i<N; i++){
fgets(s,100,stdin);
x=y=0;
int poz = 0;
while (s[poz]>='0'){
x=x*10+s[poz]-'0';
++poz;
}
++poz;
while (s[poz]>='0'){
y=y*10+s[poz]-'0';
++poz;
}
G[x].push_back(y);
G[y].push_back(x);
}
df(1, 0);
for (i=1; i<=N; i++)
if (K<F[i])
prod[1] = 0;
printf("%d\n",prod[1]);
return 0;
}