Cod sursa(job #2253564)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 4 octombrie 2018 09:51:54
Problema Colorare3 Scor 10
Compilator cpp Status done
Runda shimulare_shmecheri Marime 1.73 kb
#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;
}