Pagini recente » Cod sursa (job #1890069) | Cod sursa (job #3041848) | Cod sursa (job #1934472) | Cod sursa (job #20738) | Cod sursa (job #2253564)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in ("colorare3.in");
ofstream out ("colorare3.out");
#define ll long long
int const nmax = 100000;
int const modulo = 1000000007;
vector<int> g[5 + nmax];
int fact[5 + nmax];
void gcd(int a ,int b , int &x , int &y){
if(b == 0){
x = 1;
y = 0;
} else {
gcd(b , a % b , x , y);
int aux = x;
x = y;
y = aux - a / b * y;
}
}
void computefact(){
fact[0] = 1;
for(int i = 1 ; i <= nmax ; i++)
fact[i] = 1LL * fact[i - 1] * i % modulo;
}
ll dp[5 + nmax];
ll form[5 + nmax];
ll form2[5 + nmax];
int n , k;
void computeform(){
form[0] = k;
for(int i = 1 ; i <= n ; i++) {
form[i] = 1LL * form[i - 1] * (k - i) % modulo;
//cout << i << " " << k << " " << form[i] << '\n';
}
form2[0] = k - 1;
for(int i = 1 ; i <= n ; i++)
form2[i] = 1LL * form2[i - 1] * (k - 1 - i) % modulo;
}
ll forms(ll x , ll y){
if(y < x)
return 1;
//cout << x << " " << y << '\n';
if(y == k) {
//cout << form[y - x] << '\n';
return form[y - x];
} else {
//cout << form2[y - x] << '\n';
return form2[y - x];
}
}
int main()
{
computefact();
in >> n >> k;
computeform();
for(int i = 1 ; i < n ; i++){
int x , y;
in >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
for(int i = 1 ; i <= n ; i++){
if(k < g[i].size()) {
out << 0;
return 0;
}
}
int result = 1;
for(int i = 2 ; i <= n ; i++){
result = 1LL * result * forms(k - g[i].size() + 1 , k - 1) % modulo;
}
result = 1LL * result * forms(k - g[1].size() + 1, k);
out << result;
return 0;
}