Cod sursa(job #2023312)

Utilizator antanaAntonia Boca antana Data 18 septembrie 2017 18:44:47
Problema Colorare3 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5 + 5;
const int MOD = 1e9 + 7;

FILE *fin, *fout;

vector < int > G[MAXN];

int k, n;
bool seen[MAXN];
long long ans = 1;

inline long long arrangements(int right, int left) {
    long long res = 1;
    if (left == 0)
        return 1LL;
    for (int i = right; i > right - left; i--)
        res = (res * i) % MOD;
    return res;
}

void DFS( int node, int dad ) {
    seen[ node ] = 1;
    int nr = 0;
    for (int son: G[ node ])
        if (!seen[son])
            nr++, DFS( son, node );

    if (!dad)
        ans = (ans * arrangements(k, nr)) % MOD;
    else
        ans = (ans * arrangements(k-1, nr)) % MOD;
}

int main()
{
    fin = fopen( "colorare3.in", "r" );
    fout= fopen( "colorare3.out","w" );

    int x, y;

    fscanf( fin, "%d%d", &n, &k );

    for (int i = 1; i < n; i++) {
        fscanf( fin, "%d%d", &x, &y );
        G[ x ].push_back( y );
        G[ y ].push_back( x );
    }

    DFS( 1, 0 );

    fprintf( fout, "%lld", ans );

    fclose( fin );
    fclose( fout );

    return 0;
}