Cod sursa(job #1451124)

Utilizator ZenusTudor Costin Razvan Zenus Data 16 iunie 2015 10:51:50
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#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;
}