U E D R , A S I H C RSS

Complete Tree Labeling/하기웅


모든 경 다 나나 결과는 런 ( )

모든 노드 = (^(깊+1) - 1)/(-1) 로 구 다.
1)) 2 2 모든 노드 = (2^(2+1) - 1)/(2-1) = 7개

모든 노드 나머 맞게 개를 나고 그것 것과 같다.
2)) 1 7개 1개를 뺀 3개를 2 맞게 3개 3개 다.
combination(루를 뺀 노드 , 루를 뺀 노드 /) 다.
combination(6, 6/2) 되고 렇게 뽑 두가 므로 2! 는 방법 다.
1 = ! * combination(루를 뺀 노드, 루를 뺸 노드/)
2 리는 깊 1 노드를 루는 또 다른 리로 반복면 된다.

~cpp
#include <iostream>
#include <cmath>
#include "BigInteger.h"
using BigMath::BigInteger;

int depth, level, nodeNum, temp, templevel, tempdepth, select, i;

BigInteger labelingNum;

BigInteger factorial[3300];

void InitFactorial()
{
	factorial[1] = 1;
	for(i=2; i<3300; i++)
		factorial[i] = factorial[i-1] * i;
}

BigInteger combination(int a, int b)
{
	if(a==b)
		return 1;
	return factorial[a]/(factorial[b]*factorial[a-b]);
}

BigInteger getCompleteTreeLabeling(int l, int d)
{
	labelingNum=1;
	tempdepth=1;
	if(l==1)
		return 1;
	nodeNum = (pow(l, d+1)-1)/(l-1);
	nodeNum--;
	while(true)
	{
		if(nodeNum==0)
			return labelingNum/l;
		select = nodeNum/l;
		labelingNum = labelingNum * factorial[l] * combination(nodeNum, select);
		nodeNum = select-1;
		tempdepth++;
	}
}

int main()
{
	InitFactorial();
	while(cin>>level>>depth)
		cout << getCompleteTreeLabeling(level, depth) << endl;
	return 0;
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:58
Processing time 0.0140 sec