Cod sursa(job #456269)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 15 mai 2010 01:09:38
Problema Colorare3 Scor Ascuns
Compilator cpp Status done
Runda Marime 0.94 kb
#include <cstdio>
#include <cassert>
#include <vector>

using namespace std;

#define FOR(i, s, d) for(i = (s); i < (d); ++i)
#define pb push_back
#define nmax 100111
#define MOD 1000000007
#define sz size()
#define lint long long

vector<int> G[nmax];
int n, k, H[nmax];

int doit(int i, int p)
{
  int j, z = (i == 0 ? 0 : 1);
  H[i] = 1;
  FOR(j, 0, G[i].sz)
    if(G[i][j] != p)
    {
      H[i] = ((lint)H[i] * doit(G[i][j], i)) % MOD;
      H[i] = ((lint)H[i] * (k - j - z)) % MOD;
    }
    else
      z -= 1;
  return H[i];
}

int main()
{
  int i, j, ii;
  freopen("colorare3.in", "r", stdin);
  freopen("colorare3.out", "w", stdout);
  assert(scanf("%d %d", &n, &k) == 2);
  assert(1 <= n && n <= 100000);
  assert(1 <= k && k <= 1000000000);
  FOR(ii, 1, n)
  {
    assert(scanf("%d %d", &i, &j) == 2);
    i--, j--;
    assert(0 <= i && i < n);
    assert(0 <= j && j < n);
    G[i].pb(j), G[j].pb(i);
  }
  printf("%d\n", doit(0, 0));
  return 0;
}