Pagini recente » Cod sursa (job #888633) | Cod sursa (job #368686) | Cod sursa (job #577511) | Cod sursa (job #2278476) | Cod sursa (job #1451124)
#include <cstdio>
#include <vector>
#define NMAX 100001
#define MOD 666013
#define LL long long
using namespace std;
int Ways[NMAX],F[NMAX],IM[NMAX];
int N;
bool sel[NMAX];
vector < int > Tree[NMAX],L[NMAX];
int lgPOW(int X, int P)
{
if (!P) return 1;
int Help=lgPOW(X,P/2);
Help=((LL)Help*(LL)Help)%MOD;
if (P%2) Help=((LL)Help*(LL)X)%MOD;
return Help;
}
int solve(int nod)
{
if (Ways[nod]==1) return 1;
int P=1,cate_sunt=Ways[nod]-1,tempC;
vector < int > :: iterator it;
for (it=Tree[nod].begin();it!=Tree[nod].end();++it)
{
tempC=(((LL)F[cate_sunt]*(LL)IM[cate_sunt-Ways[*it]]*(LL)IM[Ways[*it]])%MOD);
P=((LL)P*(LL)tempC*(LL)solve(*it))%MOD;
cate_sunt-=Ways[*it];
}
return P;
}
void DFS(int nod)
{
vector < int > :: iterator it;
for (it=Tree[nod].begin();it!=Tree[nod].end();++it)
{
DFS(*it);
Ways[nod]+=Ways[*it];
}
++Ways[nod];
}
void BTree(int nod)
{
sel[nod]=true;
vector < int > :: iterator it;
for (it=L[nod].begin();it!=L[nod].end();++it)
{
if (sel[*it]) continue;
Tree[nod].push_back(*it);
BTree(*it);
}
}
void Read()
{
scanf("%d",&N);
int i,X,Y;
for (i=1;i<N; ++i)
{
scanf("%d%d",&X,&Y);
L[X].push_back(Y);
L[Y].push_back(X);
}
}
void Precalcul()
{
int i;
F[0]=IM[0]=1;
for (i=1;i<N;++i)
{
F[i]=((LL)F[i-1]*i)%MOD;
IM[i] = lgPOW(F[i], MOD - 2);
}
}
int main() {
freopen("arbore1.in", "r", stdin);
freopen("arbore1.out", "w", stdout);
Read();
Precalcul();
BTree(1);
DFS(1);
printf("%d\n", solve(1));
return 0;
}