Pagini recente » Cod sursa (job #2449597) | Cod sursa (job #1643132) | Cod sursa (job #900777) | Cod sursa (job #853626) | Cod sursa (job #466339)
Cod sursa(job #466339)
#include<cstdio>
short m[100001][100000], 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;
}