这个可以当新题解吗(没有数组递推和函数递归)
查看原帖
这个可以当新题解吗(没有数组递推和函数递归)
774592
Augensterm楼主2023/7/26 21:28

卡特兰数

卡特兰数的公式为h(n)=C(2n,n)÷(n+1)!h (n) =C(2n,n) \div (n+1)!

展开来就是h(n)=2n!÷(n+1)!÷n!h (n) =2n! \div (n+1)! \div n! 

本题的思路

根据公式如果直接来算2n!2n!,nn最大为1818,开longlong longlong也会爆,那么不妨在计算过程中进行一些优化。
首先被除数2n!2n!和n!n!都有n!n!,那么可以直接不算。 然后部分代码为:

for(int i=n+2;i<=2*n;i++)
	sum*=i
for(int i=2;i<=n;i++)
   sum/=i;

这样还是不能ACAC,那么怎么优化呢?
我们不妨想当此循环ii为22的倍数时,那么在之后除以 (n+1)! (n+1)! 时还会除以 i÷2i\div2 的值,那么这种ii 就干脆只乘以 22,那么就极大减小了sumsum 所记录的值的防止爆空间。根据此思路就完成了AC代码

for(int i=n+2;i<=2*n;i++)
    {
    	if(i%2==0)
    		sum*=2;
    	else
    		sum*=i;
	}
    	
    for(int i=2;i<=n;i++)
    	if(i*2<n+2)
    		sum/=i;

防止直接抄题解就只有部分代码。

2023/7/26 21:28
加载中...