Tyvj 1363 火车进出栈问题 (高精度+卡特兰数+组合数学)

P1363 火车进出栈问题
时间: 1000ms / 空间: 131072KiB / Java类名: Main

描述
一列火车n节车厢,依次编号为1,2,3,…,n。每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种。
输入格式

一个数,n(n<=30000)

输出格式
一个数s表示n节车厢出栈的可能排列方式

测试样例
输入
3

输出
5

很容易看出来是卡特兰数(别问我怎么看出来的!自己划数据!),但是数据很大(卡特兰数的一二十位就接近maxlongint了),所以我们用卡特兰数的一个通项公式来求:
f[n]=C(2n,n)/(n+1)
这样我们只需要求组合数C(2n,n)就可以啦!

program mys;
var i,j,k,m,n,x,l:longint;
f:array[0..100000]of longint;
d:array[0..100000]of longint;

begin 
readln(n);

for i:=n+2 to 2*n do 
begin 
x:=i;
for j:=2 to trunc(sqrt(i)) do  
while x mod j=0 do 
begin 
x:=x div j;
inc(d[j]);
end;
if x<>1 then inc(d[x]);
end;
for i:=2 to n do 
begin 
x:=i;
for j:=2 to trunc(sqrt(i)) do 
while x mod j=0 do 
begin 
x:=x div j;
dec(d[j]);
end;
if x<>1 then dec(d[x]);
end;   
//至此,筛出C(2n,n)/n-1的所有质因子,d[i]记录质因子出现次数

f[1]:=1; l:=1;   //高精度求C(2n,n)/(n+1)
for i:=2 to n*2 do 
while d[i]>0 do 
begin 
dec(d[i]);
x:=0;
for j:=1 to l do
begin 
f[j]:=f[j]*i+x;
x:=f[j] div 10;
f[j]:=f[j] mod 10;
end;
while x>0 do 
begin 
inc(l);
f[l]:=x mod 10;
x:=x div 10;
end;
end;
for i:=l downto 1 do 
write(f[i]);
end.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值