Cod sursa(job #466228)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 26 iunie 2010 12:21:51
Problema Colorare3 Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.9 kb
#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;
int inv,aux;
vector<int> G[MAXN];
char s[100];
int P[MAXN];

inline void df(const int &nod,const 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] =(int) (1LL * prod[nod] * (K-F[fiu])) % MODULO;
            if (K<F[fiu]) { prod[nod]=0; return; }
            prod[nod] =(int) (1LL * prod[nod]*prod[fiu]) % MODULO;
        }

    prod[nod] =(int) (1LL * prod[nod] * P[F[nod]]) % MODULO;
    prod[nod] =(int) (1LL * prod[nod] * A[F[nod]]) % MODULO;
}

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

    P[0] = 1LL;
    for (int i=1; i<=N; ++i)
        P[i] =(int) (1LL * P[i-1]*inv) % 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",&N,&K);

	euclid(K,MODULO,inv,aux);

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

    aranj();

 /*   for (i=1; i<N; i++){
        fgets(s,20,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;
}