Pagini recente » Cod sursa (job #2342608) | Cod sursa (job #1939304) | Cod sursa (job #2294601) | Cod sursa (job #3033032) | Cod sursa (job #718750)
Cod sursa(job #718750)
#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;
}