Tyvj 1363 火车进出栈问题 (高精度+卡特兰数+组合数学)
2016-11-11 20:40
281 查看
P1363 火车进出栈问题
时间: 1000ms / 空间: 131072KiB / Java类名: Main
描述
一列火车n节车厢,依次编号为1,2,3,…,n。每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种。
输入格式
一个数,n(n<=30000)
输出格式
一个数s表示n节车厢出栈的可能排列方式
测试样例
输入
3
输出
5
很容易看出来是卡特兰数(别问我怎么看出来的!自己划数据!),但是数据很大(卡特兰数的一二十位就接近maxlongint了),所以我们用卡特兰数的一个通项公式来求:
f
=C(2n,n)/(n+1)
这样我们只需要求组合数C(2n,n)就可以啦!
时间: 1000ms / 空间: 131072KiB / Java类名: Main
描述
一列火车n节车厢,依次编号为1,2,3,…,n。每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种。
输入格式
一个数,n(n<=30000)
输出格式
一个数s表示n节车厢出栈的可能排列方式
测试样例
输入
3
输出
5
很容易看出来是卡特兰数(别问我怎么看出来的!自己划数据!),但是数据很大(卡特兰数的一二十位就接近maxlongint了),所以我们用卡特兰数的一个通项公式来求:
f
=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.
相关文章推荐
- Tyvj P1363 火车进出栈问题(catalan数+高精度) pascal
- 火车进出站问题:有多少种出站序列
- 火车进出铁轨问题
- HDU 1022 火车进出站问题
- HDU 1022 火车进出站问题
- HDU 1022 火车进出站问题
- c语言考试中 火车进出站的问题解法是什么
- poj 1363 火车进站问题,栈的基本应用
- hdoj 1022 火车进出站问题
- 火车进出站问题---栈
- HDU-1022-火车进出站问题 .
- HDU-1022 火车进出站问题【栈】
- 火车进出栈问题(强化版)
- 火车进出站序列问题简述
- Tyvj P1336 火车进栈(栈的顺序问题)
- 火车运煤问题
- tyvj 1170 0/1字符串问题 字符串中仅包含0和1两个字符;②字符串的长度为n;③字符串中不含有三个连续的相同子串 搜索
- 高精度的精度问题
- tyvj 1214 硬币问题 完全背包 恰好 最大/最少
- 面试题:火车运煤问题