Cod sursa(job #466243)

Utilizator sodamngoodSo Damn Good sodamngood Data 26 iunie 2010 12:28:30
Problema Colorare3 Scor 50
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.96 kb
#include <iostream>
#include <queue>
using namespace std;
#define nmax 100010
#define mod 1000000007
#define maxbuf 65536
#define LL long long
#define PB push_back

char buff[maxbuf];
int N, K, viz[nmax], deg[nmax];
int M[nmax], pos[nmax], start[nmax], finish[nmax], deq[nmax];
long long 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);
         while(fact[i] >= mod) fact[i] -= mod;
    }
}

void DetArbore(int nod) {
     int i, p, q;
     queue<int> Q;
     viz[nod]=1;
     Q.push(nod);
     while(!Q.empty()) {
          p=Q.front(); Q.pop();
          for(i=start[p]; i<=finish[p]; i++) {
              if(!viz[ M[i] ]) {
                   viz[ M[i] ]=1;
                   deg[p]++;
                   Q.push( M[i] );
              }
          }
     }
}

int main() {
    FILE *f1=fopen("colorare3.in", "r"), *f2=fopen("colorare3.out", "w");
    int i, x1 = 0, y1 = 0, p, q;
    
    fscanf(f1, "%d %d\n", &N, &K);
    
    preproc();
    
    for(i=1; i<N; i++) {
         fscanf(f1, "%d %d\n", &p, &q);
         deq[p]++; deq[q]++;
    }
    start[1]=1; finish[1]=deq[1];
    for(i=2; i<=N; i++) {
         start[i]=finish[i-1]+1;
         finish[i]=start[i]+deq[i]-1;
    }
    FILE *f3=fopen("colorare3.in", "r");
    fscanf(f3, "%d %d\n", &N, &K);
    for(i=1; i<N; i++) {
         fscanf(f3, "%d %d\n", &p, &q);
         M[start[p]+pos[p]]=q; pos[p]++;
         M[start[q]+pos[q]]=p; pos[q]++;
    }
    fclose(f3);
    
    DetArbore(1);
    
    sol = 1;
    p = deg[1];
    long long x = ((LL)fact[p-1] * K) % mod;
    sol = ((LL)sol*x) % mod;
    
    for(i=2; i<=N; i++) {
         if(deg[i]) {
              int p = deg[i];
              sol = ((LL)sol*fact[p]) % mod;
         }
    }

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