Pagini recente » Junior Challenge 2008, Clasament | Cod sursa (job #414499) | Cod sursa (job #209699) | Cod sursa (job #2163325) | Cod sursa (job #2021295)
#include <bits/stdc++.h>
const int MAXN = (int) 1e5;
const int MOD = (int) 1e9 + 7;
std::vector <int> g[MAXN + 1];
std::pair <int, int> v[MAXN + 1];
int k;
void dfs(int nod, int p) {
if(p == 0)
v[nod] = {k - g[nod].size() + 1, k};
else
v[nod] = {k - (g[nod].size() - 1), k - 1};
for(auto it : g[nod])
if(it != p)
dfs(it, nod);
}
int sp[MAXN + 10];
inline int lgput(int a, int b) {
int ans = 1;
while(b > 0) {
if(b & 1)
ans = (1LL * ans * a) % MOD;
b >>= 1;
a = (1LL * a * a) % MOD;
}
return ans;
}
int main() {
FILE *fi, *fout;
int i, n, a, b;
fi = fopen("colorare3.in" ,"r");
fout = fopen("colorare3.out" ,"w");
fscanf(fi,"%d %d " ,&n,&k);
for(i = 1; i < n; i++) {
fscanf(fi,"%d %d " ,&a,&b);
g[a].push_back(b);
g[b].push_back(a);
}
dfs(1, 0);
int min = (1 << 30);
for(i = 1; i <= n; i++)
min = std::min(min, v[i].first);
min--;
for(i = 1; i <= n; i++) {
sp[v[i].first - min]++;
sp[v[i].second - min + 1]--;
}
int ans = 1;
for(i = 1; i <= n; i++) {
sp[i] += sp[i - 1];
ans = (1LL * ans * lgput(i + min, sp[i])) % MOD;
}
fprintf(fout,"%d" ,ans);
fclose(fi);
fclose(fout);
return 0;
}