您的位置:首页 > 其它

hdu Count the Trees

2011-07-31 10:04 435 查看

CounttheTrees

TimeLimit:2000/1000MS(Java/Others)MemoryLimit:65536/32768K(Java/Others)
TotalSubmission(s):135AcceptedSubmission(s):102
[align=left]ProblemDescription[/align]
AnothercommonsocialinabilityisknownasACM(AbnormallyCompulsiveMeditation).Thispsychologicaldisorderissomewhatcommonamongprogrammers.Itcanbedescribedasthetemporary(althoughfrequent)lossofthefacultyofspeechwhenthewholepowerofthebrainisappliedtosomethingextremelyinterestingorchallenging.
Juanisaverygiftedprogrammer,andhasaseverecaseofACM(heevenparticipatedinanACMworldchampionshipafewmonthsago).Lately,hislovedonesareworriedabouthim,becausehehasfoundanewexcitingproblemtoexercisehisintellectualpowers,andhehasbeenspeechlessforseveralweeksnow.Theproblemisthedeterminationofthenumberofdifferentlabeledbinarytreesthatcanbebuiltusingexactlyndifferentelements.

Forexample,givenoneelementA,justonebinarytreecanbeformed(usingAastherootofthetree).Withtwoelements,AandB,fourdifferentbinarytreescanbecreated,asshowninthefigure.



Ifyouareabletoprovideasolutionforthisproblem,Juanwillbeabletotalkagain,andhisfriendsandfamilywillbeforevergrateful.

[align=left]Input[/align]
Theinputwillconsistofseveralinputcases,oneperline.Eachinputcasewillbespecifiedbythenumbern(1≤n≤100)ofdifferentelementsthatmustbeusedtoformthetrees.Anumber0willmarktheendofinputandisnottobeprocessed.

[align=left]Output[/align]
Foreachinputcaseprintthenumberofbinarytreesthatcanbebuiltusingthenelements,followedbyanewlinecharacter.

[align=left]SampleInput[/align]

1
2
10
25
0


[align=left]SampleOutput[/align]

1
4
60949324800
75414671852339208296275849248768000000



给定n个元素,求组成的树的不同的结构的个数。
分析:元素的排列方式为n!种,树的结构不同形式为卡特兰数C(n),
所以:总共的数的不同结构为n!*C(n);


importjava.util.*;


import
java.math.*;
publicclass
Main{

publicstatic
voidmain(String[]args){
Scanner
cin=newScanner(System.in);
BigDecimal
[]a=newBigDecimal[101];
BigDecimal
[]kt=newBigDecimal[101];
BigDecimal
b,n;
int
k;
a[0]=BigDecimal.valueOf(1);
for
(inti=1;i<101;i++){
b=a[i-1].multiply(BigDecimal.valueOf(i));
a[i]=b;
}

kt[1]=BigDecimal.valueOf(1);
for
(inti=2;i<101;i++){
n=BigDecimal.valueOf(i);
b=BigDecimal.valueOf(4).multiply(n);
b=b.subtract(BigDecimal.valueOf(2));
n=n.add(BigDecimal.valueOf(1));
b=b.multiply(kt[i-1]);
kt[i]=b.divide(n);
}

while
(cin.hasNext()){
k=cin.nextInt();
if
(k==0)break;
b=a[k].multiply(kt[k]);
System
.out.println(b);
}
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: