Cod sursa(job #466197)

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

using namespace std;

#define MODULO 1000000007
#define MAXN 100005

long long 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){
            int fiu = *it;
            ++F[nod];
            df(fiu, nod);
            prod[nod] = (prod[nod] * (K-F[fiu])) % MODULO;
            if (K<F[fiu]) { prod[nod]=0; return; }
            prod[nod] = (prod[nod]*prod[fiu]) % MODULO;
        }
    for (int i=1; i<=F[nod]; ++i)
        prod[nod] = (prod[nod]*inv) % 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)) % MODULO;
}

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;
}