Tyvj P1363 火车进出栈问题(catalan数+高精度) pascal

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

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

一个数,n(n<=30000)
输出格式

一个数s表示n节车厢出栈的可能排列方式
测试样例1

输入

3
输出

5

思路:首先知道catalan数通项公式:h(n)=c(2n,n)/(n+1);
说白了就是求c(2n,n)(这个公式再不知道我也是没辙),
将每个数分解质因数,n+1 to 2*n 的每个质因数个数加上(因为要除(n+1),所以从n+2开始),1 to n-m的每个质因数个数减去,数组记录,最后高精乘以单精,轻松AC Σ(っ °Д °;)っ

program df;
var i,j,n,m,x,y,z,k,t:longint;
a,d:array[0..100000] of longint;
procedure deal(n,m:longint);
var i,j,x,y:longint;
begin
for i:=m+2 to n do
begin
x:=i;
for j:=2 to trunc(sqrt(x)) do
while x mod j=0 do
begin
inc(d[j]);
x:=x div j;
end;
if x>1 then inc(d[x]);
end;
for i:=1 to n-m do
begin
x:=i;
for j:=2 to trunc(sqrt(x)) do
while x mod j=0 do
begin
dec(d[j]);
x:=x div j;
end;
if x>1 then dec(d[x]);
end;
end;

begin
readln(n);
deal(2*n,n);
a[1]:=1; t:=1;
for i:=2 to 3*n do
while d[i]>0 do
begin
for j:=1 to t do
a[j]:=a[j]*i;
for x:=1 to t do
begin
a[x+1]:=a[x+1]+a[x] div 10;
a[x]:=a[x] mod 10;
end;
j:=t+1;
while a[j]<>0 do
begin
a[j+1]:=a[j+1]+a[j] div 10;
a[j]:=a[j] mod 10;
inc(j);
end;
t:=j-1;
dec(d[i]);
end;
for i:=t downto 1 do
write(a[i]);
end.

转载于:https://www.cnblogs.com/Gxyhqzt/p/7784280.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值