Pagini recente » Cod sursa (job #199559) | Cod sursa (job #2558826) | Cod sursa (job #79547) | Cod sursa (job #295700) | Cod sursa (job #1761086)
#include <cstdio>
#define MAXN 100000
#define MOD 1000000007
int val[2*MAXN-1], next[2*MAXN-1], k;
int lista[MAXN+1], fact0[MAXN+1];
int d[MAXN+1], fact1[MAXN+1];
bool viz[MAXN+1];
inline void adauga(int x, int y){
k++;
val[k]=y;
next[k]=lista[x];
lista[x]=k;
}
void dfs(int x){
int p=lista[x], s=0;
d[x]=1;
viz[x]=1;
while(p){
if(!viz[val[p]]){
dfs(val[p]);
d[x]=1LL*d[x]*d[val[p]]%MOD;
s++;
}
p=next[p];
}
if(x==1) d[x]=1LL*d[x]*fact0[s]%MOD;
else d[x]=1LL*d[x]*fact1[s]%MOD;
}
int main(){
int n, k, i, x, y;
FILE *fin, *fout;
fin=fopen("colorare3.in", "r");
fout=fopen("colorare3.out", "w");
fscanf(fin, "%d%d", &n, &k);
fact0[0]=1;
for(i=1; i<=n; i++)
fact0[i]=1LL*fact0[i-1]*(k-i+1)%MOD;
fact1[0]=1;
for(i=1; i<=n; i++)
fact1[i]=1LL*fact1[i-1]*(k-i)%MOD;
for(i=1; i<n; i++){
fscanf(fin, "%d%d", &x, &y);
adauga(x, y);
adauga(y, x);
}
dfs(1);
fprintf(fout, "%d\n", d[1]);
fclose(fin);
fclose(fout);
return 0;
}