Cod sursa(job #466186)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 26 iunie 2010 12:01:13
Problema Colorare3 Scor 20
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.37 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define MODULO 1000000007
#define MAXN 100005

int A[MAXN];
int F[MAXN];
long long prod[MAXN];
int i,N,K,x,y;
int inv,aux;
vector<int> G[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){
            ++F[nod];
            df(*it, nod);
            if (K<F[*it]) { prod[nod]=0; return; }
            prod[nod] = ((prod[nod]*prod[*it]) % MODULO * ((K-F[*it]) * inv*1LL) % MODULO) % MODULO;
        }
    prod[nod] = (prod[nod] * A[F[nod]]) % MODULO;
}

inline void aranj()
{
    A[0] = 1;
    for (i=1; i<=N && i<=K; i++)
        A[i] = (A[i-1]*(K-i+1));
}

void euclid(int a, int b, int &x, int &y)
{
	if (b==0){
		x=1; y=0;
	}
	else {
		int 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,&K);

	euclid(K,MODULO,inv,aux);

	while (inv<=0)
		inv+=MODULO;

    aranj();

    for (i=1; i<N; i++){
        scanf("%d %d",&x,&y);
        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;
}