Cod sursa(job #466324)

Utilizator indestructiblecont de teste indestructible Data 26 iunie 2010 13:03:40
Problema Colorare3 Scor 50
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.43 kb
#include <stdio.h>
#include <vector>
#define NMAX 100005
#define LMAX 300005
#define pb push_back
#define MOD 1000000007
#define ll long long
using namespace std;
int n,k,dad[NMAX],fact[LMAX];
vector <int> A[NMAX],C[NMAX];
ll B[NMAX],pos[NMAX],prod[NMAX];
char viz[NMAX];
void read()
{
	scanf("%d%d",&n,&k);
	int i,x,y;
	for (i=1; i<n; i++)
	{
		scanf("%d%d",&x,&y);
		A[x].pb(y);
		A[y].pb(x);
	}
}
void precompute()
{
	fact[0]=1;
	int i;
	ll part;
	for (i=1; i<=300000; i++)
	{
		part=(ll)fact[i-1]*i;
		if (part>=MOD)
			part%=MOD;
		fact[i]=part;
	}
}
ll lgput(int baza,int exp)
{
	ll part=1,part2=baza;
	while (exp)
	{
		if (exp & 1)
			part*=part2,part%=MOD;
		part2*=part2;
		part2%=MOD;
		exp>>=1;
	}
	return part;
}
void dfs(int nod)
{
	viz[nod]=1; pos[nod]=1;
	int i,vec;
	for (i=0; i<A[nod].size(); i++)
	{
		vec=A[nod][i];
		if (!viz[vec])
		{
			dad[vec]=nod;
			C[nod].pb(vec);
			dfs(vec);
		}
	}
	int act=k,p=C[nod].size();
	if (dad[nod])
		act--;
	if (p)
	{
		pos[nod]=(ll)fact[act]*lgput(fact[act-p],MOD-2);
		if (pos[nod]>=MOD)
			pos[nod]%=MOD;
	}
	prod[nod]=pos[nod];
	for (i=0; i<C[nod].size(); i++)
	{
		vec=C[nod][i];
		prod[nod]*=prod[vec];
		if (prod[nod]>=MOD)
			prod[nod]%=MOD;
	}
}
int main()
{
	freopen("colorare3.in","r",stdin);
	freopen("colorare3.out","w",stdout);
	read();
	precompute();
	dfs(1);
	printf("%lld\n",prod[1]);
	return 0;
}