Cod sursa(job #466160)

Utilizator sodamngoodSo Damn Good sodamngood Data 26 iunie 2010 11:39:27
Problema Colorare3 Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.87 kb
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define nmax 1000010
#define mod 1000000007
#define LL long long
#define PB push_back

int N, K, viz[nmax], fact[nmax];
long long sol;
vector<int> G[nmax];

void preproc() {
    fact[0] = 1;
    fact[1] = (K - 1) % mod;
    for(int i=2; i<=N; i++) {
         fact[i] = ((LL)fact[i-1]*(K - i)) % mod;
    }
}

void DetArbore(int nod) {
     int p, q;
     queue<int> Q;
     vector<int> X;
     viz[nod]=1;
     Q.push(nod);
     while(!Q.empty()) {
          p=Q.front(); Q.pop();
          for(vector<int>::iterator it=G[p].begin(); it!=G[p].end(); it++) {
              if(!viz[(*it)]) {
                   viz[(*it)]=1;
                   X.push_back(*it);
                   Q.push((*it));
              }
          }
          G[p].clear();
          for(vector<int>::iterator it=X.begin(); it!=X.end(); it++) {
               G[p].push_back(*it);
          }
          X.clear();
     }
}

void DFS(int nod) {
    viz[nod] = 1;
    for(vector<int>::iterator it=G[nod].begin(); it!=G[nod].end(); it++) {
         if(!viz[*it]) DFS(*it);
    }
    
    if(nod == 1) {
         int p = G[nod].size();
         int x = ((LL)fact[p-1] * K) % mod;
         sol = ((LL)sol*x) % mod;
    }
    else if(G[nod].size()) {
         int p = G[nod].size();
         sol = ((LL)sol*fact[p]) % mod;
    }
}

int main() {
    FILE *f1=fopen("colorare3.in", "r"), *f2=fopen("colorare3.out", "w");
    int i, p, q;
    
    fscanf(f1, "%d %d\n", &N, &K);
    
    preproc();
    
    for(i=1; i<N; i++) {
         fscanf(f1, "%d %d\n", &p, &q);
         G[p].PB(q);
         G[q].PB(p);
    }
    
    //DetArbore(1);
    
    memset(viz, 0, sizeof(viz));
    
    sol = 1;
    DFS(1);

    fprintf(f2, "%lld\n", sol);
    fclose(f1); fclose(f2);
    return 0;
}