Cod sursa(job #1761086)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 21 septembrie 2016 19:37:10
Problema Colorare3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#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;
}