Cod sursa(job #466167)

Utilizator sodamngoodSo Damn Good sodamngood Data 26 iunie 2010 11:43:14
Problema Colorare3 Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.72 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();
     }
}

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);
    
    sol = 1;
    for(i=1; i<=N; i++) {
         if(i == 1) {
              int p = G[i].size();
              int x = ((LL)fact[p-1] * K) % mod;
              sol = ((LL)sol*x) % mod;
         }
         else if(G[i].size()) {
              int p = G[i].size();
              sol = ((LL)sol*fact[p]) % mod;
         }
    }

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