Cod sursa(job #2021295)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 13 septembrie 2017 09:41:37
Problema Colorare3 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>

const int MAXN = (int) 1e5;
const int MOD = (int) 1e9 + 7;

std::vector <int> g[MAXN + 1];

std::pair <int, int> v[MAXN + 1];
int k;

void dfs(int nod, int p) {
    if(p == 0)
       v[nod] = {k - g[nod].size() + 1, k};
    else
       v[nod] = {k - (g[nod].size() - 1), k - 1};
    for(auto it : g[nod])
        if(it != p)
            dfs(it, nod);
}

int sp[MAXN + 10];

inline int lgput(int a, int b) {
    int ans = 1;
    while(b > 0) {
        if(b & 1)
            ans = (1LL * ans * a) % MOD;
        b >>= 1;
        a = (1LL * a * a) % MOD;
    }
    return ans;
}

int main() {
    FILE *fi, *fout;
    int i, n, a, b;
    fi = fopen("colorare3.in" ,"r");
    fout = fopen("colorare3.out" ,"w");
    fscanf(fi,"%d %d " ,&n,&k);
    for(i = 1; i < n; i++) {
        fscanf(fi,"%d %d " ,&a,&b);
        g[a].push_back(b);
        g[b].push_back(a);
    }
    dfs(1, 0);
    int min = (1 << 30);
    for(i = 1; i <= n; i++)
        min = std::min(min, v[i].first);
    min--;
    for(i = 1; i <= n; i++) {
        sp[v[i].first - min]++;
        sp[v[i].second - min + 1]--;
    }
    int ans = 1;
    for(i = 1; i <= n; i++) {
        sp[i] += sp[i - 1];
        ans = (1LL * ans * lgput(i + min, sp[i])) % MOD;
    }
    fprintf(fout,"%d" ,ans);
    fclose(fi);
    fclose(fout);
    return 0;
}