Pagini recente » Cod sursa (job #37219) | Cod sursa (job #2568190) | Cod sursa (job #3261565) | Cod sursa (job #1904724) | Cod sursa (job #466170)
Cod sursa(job #466170)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define nmax 1000010
#define mod 1000000007
#define LL long long
#define PB push_back
int N, K, viz[nmax];
long long fact[nmax];
long long sol;
vector<int> G[nmax];
void preproc() {
fact[0] = 1;
fact[1] = (K - 1) % mod;
for(int i=2; i<=N; i++) {
fact[i] = (LL)fact[i-1]*(K - i);
while(fact[i] >= mod) fact[i] -= mod;
}
}
void DetArbore(int nod) {
int p, q;
queue<int> Q;
vector<int> X;
viz[nod]=1;
Q.push(nod);
while(!Q.empty()) {
p=Q.front(); Q.pop();
for(vector<int>::iterator it=G[p].begin(); it!=G[p].end(); it++) {
if(!viz[(*it)]) {
viz[(*it)]=1;
X.push_back(*it);
Q.push((*it));
}
}
G[p].clear();
for(vector<int>::iterator it=X.begin(); it!=X.end(); it++) {
G[p].push_back(*it);
}
X.clear();
}
}
int main() {
FILE *f1=fopen("colorare3.in", "r"), *f2=fopen("colorare3.out", "w");
int i, p, q;
fscanf(f1, "%d %d\n", &N, &K);
preproc();
for(i=1; i<N; i++) {
fscanf(f1, "%d %d\n", &p, &q);
G[p].PB(q);
G[q].PB(p);
}
DetArbore(1);
sol = 1;
for(i=1; i<=N; i++) {
if(i == 1) {
int p = G[i].size();
long long x = (LL)fact[p-1] * K;
while(x >= mod) x -= mod;
sol = (LL)sol*x;
while(sol >= mod) sol -= mod;
}
else if(G[i].size()) {
int p = G[i].size();
sol = (LL)sol*fact[p];
while(sol >= mod) sol -= mod;
}
}
fprintf(f2, "%lld\n", sol);
fclose(f1); fclose(f2);
return 0;
}