此题是hdu3723
此题首先想有点像栈,因为最后要回到第一排。所以向上一个必然向下一个,这就有点像栈进去一个出来一个。然后呢,求组合个数。那这是不是就是卡特兰数呢?今天正好看了组合数学卡特兰数。
那么上下是卡特兰数的个数,这里还有横线的个数,横线可以理解为在上下中插入横线。比方说:n=4的时候,在上的个数为1下的个数为1的时候,卡特兰数为1,那么还余下2个位置需要放横线,横线插入到里面的方案数就是C(4,2)=6。然后上下个数各为2的时候那么横线数是0,方案数是2,同样还有一个上下个数各为1的时候为1种方案。
那么通项公式就是
S(n)=S(n-1)+f(n)其中f(n)为当前上下个数的组合数。这里关键就是求组合数。
组合数f(n)=Ci*C(n,n-2*i)其中Ci是卡特兰数,C(n,n-2*i)是放横线的个数
但是此处求f(n)到了n比较大的时候就无穷大了,所以需要用到大数。那么大数求C比较繁琐,我们应该找到递归式子,然后递推求出那么将f(i)/f(i-1)=4(i-2)/(i+1) * n!/((n-n+2i)!(n-2i)!) / n!/((n-n+2i-2)!(n-2i+2)!)请自己化简后得:
((4i-2)(n-2i+1)(n-2i+2))/((i+1)(2i-1)2i)然后用大数求出来就可以了。
f(n)=f(n-1)*(n-2i+1)(n-2i+2)/(i*(i+1))
此题我用java做的因为用c++写乘法和除法太过麻烦我就选择了java,代码很短,不超过15行 1秒左右。