Cod sursa(job #466396)

Utilizator deneoAdrian Craciun deneo Data 26 iunie 2010 15:39:46
Problema Colorare3 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<cstdio>
short m[10001][10000], v[100000], ln, viz[100001], lv=0, v2[100000], l; // m micsorat pt. debug
inline long long fact(int f, int a){ long long sum=1; for(int i=f-a+1; i<=f; ++i) sum=sum*i%1000000007; return sum;}
int main()
{
	long long pos=0, k;
	long i, n, p1, p2, max=-1, p, j, da;
	freopen("colorare3.in", "rt", stdin);
	freopen("colorare3.out", "wt", stdout); // ai grija la exeptia cand nu exista posibilitati
	scanf("%ld%lld", &n, &k);
	for(i=1; i<n; ++i)
	{
		scanf("%ld%ld", &p1, &p2);
		++m[p1][0];
		m[p1][m[p1][0]]=p2;
		++m[p2][0];
		m[p2][m[p2][0]]=p1;
	}
	for(i=1; i<=n; ++i)
	{
		if(m[i][0]>max)
		{
			max=m[i][0];
			p=i;
		}
	}
	if(max>k)
	{
		printf("0\n");
		return 0;
	}
	pos=fact(k, max);
	ln=1;
	for(i=1; i<=m[p][0]; ++i, ++ln)
	{
		v[ln]=m[p][i];
		viz[m[p][i]]=1;
	}
	viz[p]=1; // ai grija ln
	++lv;
	--ln;
	da=1;
	while(da)
	{
		l=1;
		da=0;
		for(i=1; i<=ln; ++i)
		{
			p=0;
			for(j=1; j<=m[v[i]][0]; ++j)
			{
				if(!viz[m[v[i]][j]])
				{
					da=1;
					++p;
					v2[l]=m[v[i]][j];
					viz[m[v[i]][j]]=1;
					++l;
				}
			}
			pos=(pos*fact(k-1, p))%1000000007;
		}
		ln=l-1;
		for(i=1; i<=ln; ++i)
			v[i]=v2[i];
	}
	printf("%lld\n", pos);
	return 0;
}