Cod sursa(job #466208)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const char InFile[]="colorare3.in";
const char OutFile[]="colorare3.out";
const int MaxN=100010;
const unsigned long long MOD=1000000007;
vector<int> a[MaxN];
int viz[MaxN];
int nrViz[MaxN];
unsigned long long c[MaxN];
ifstream fin(InFile);
ofstream fout(OutFile);
unsigned long long C=1;
int N,K,x,y;
void bfs(int nod)
{
queue<int> q;
q.push(nod);
viz[nod]=1;
while(!q.empty())
{
nod=q.front();
q.pop();
for(register int i=0;i<a[nod].size();++i)
{
if(viz[a[nod][i]]==0)
{
q.push(a[nod][i]);
viz[a[nod][i]]=1;
++nrViz[a[nod][i]];
c[nod]*=(K-nrViz[nod]);
c[nod]%=MOD;
++nrViz[nod];
}
}
}
}
int main()
{
fin>>N>>K;
for(register int i=1;i<N;++i)
{
fin>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
c[i]=1;
}
c[N]=1;
fin.close();
bfs(1);
for(register int i=1;i<=N;++i)
{
C*=c[i];
C%=MOD;
}
fout<<C;
fout.close();
return 0;
}