Cod sursa(job #718750)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 21 martie 2012 08:26:00
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include<stdio.h>
#include<assert.h>

#include<algorithm>
#include<vector>
#include<queue>

using namespace std;

const int knmax = 100005, kmod = 666013;
int verts, sol, ftrm[knmax], invftrm[knmax], subvert[knmax];
vector<int> graph[knmax];

void read(){
  assert(freopen("arbore4.in", "r", stdin) != NULL);

  scanf("%d", &verts);

  int aux_x, aux_y;
  for(int i = 1; i < verts; ++i){
    scanf("%d%d", &aux_x, &aux_y);
    graph[aux_x].push_back(aux_y);
    graph[aux_y].push_back(aux_x);
  }

}

int po_aux;

long long powr(long long x, int pow){
  if(pow == 1)
    return x;
  if(pow % 2 == 0){
    x = powr(x, pow / 2);
    return (x * x) % kmod;
  }
  x = powr(x, pow / 2);
  return ((x * x % kmod) * po_aux) % kmod;
}

void gen_ft_invft(){
  int i = 1;
  ftrm[i] = 1;
  invftrm[0] = ftrm[0] = 1;

  for(i = 2; i <= verts; ++i)
    ftrm[i] = ((long long)ftrm[i - 1] * i) % kmod;

  po_aux = 2;
  printf("%lld",powr(2, 20));

  po_aux = ftrm[verts];
  invftrm[verts] = powr(ftrm[verts], kmod - 2);
  for(i = verts - 1; i > 0; --i)
    invftrm[i] = ((long long)invftrm[i + 1] * i) % kmod;

}

void dfs(int x){
  subvert[x] = 1;

  for(vector<int>::iterator it = graph[x].begin(); it < graph[x].end(); ++it)
    if(!subvert[*it]){
      dfs(*it);
      subvert[x] += subvert[*it];
    }

}

long long comb(int x, int y){
  return (((ftrm[x] * invftrm[y]) % kmod) * invftrm[x - y]) % kmod;
}

int bfs(){
  int now;
  long long r_val = 1;
  queue<int> q;
  vector<int>::iterator it;
  q.push(1);

  while(!q.empty()){
    now = q.front();
    q.pop();

    --subvert[now];
    if(subvert[now])
      for(it = graph[now].begin(); it < graph[now].end(); ++it)
        if(subvert[*it]){
          r_val = (r_val * comb(subvert[now], subvert[*it])) % kmod;
          subvert[now] -= subvert[*it];
          q.push(*it);
        }
  }

  return r_val;

}

void solve(){
  gen_ft_invft();

  dfs(1);
  sol = bfs();

}

void write(){
  assert(freopen("arbore4.out", "w", stdout) != NULL);

  printf("%d", sol);

}

int main(){
  read();
  solve();
  write();
  return 0;
}