描述 Description
一列火车n节车厢,依次编号为1,2,3,…,n。每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种。
输入格式 InputFormat
一个数,n(n<=50000)
输出格式 OutputFormat
一个数s表示n节车厢出栈的可能排列方式
样例输入 SampleInput
样例输出 SampleOutput
计算卡特兰数的第N项。
先分解质因数(注意同时直接求出P^i),然后高精度乘。
卡常数,自己试试吧
#01: Accepted (0ms, 1316KB)
#02: Accepted (0ms, 1316KB)
#03: Accepted (0ms, 1316KB)
#04: Accepted (0ms, 1316KB)
#05: Accepted (0ms, 1316KB)
#06: Accepted (0ms, 1316KB)
#07: Accepted (0ms, 1316KB)
#08: Accepted (0ms, 1316KB)
#09: Accepted (0ms, 1316KB)
#10: Accepted (6ms, 1316KB)
#11: Accepted (0ms, 1316KB)
#12: Accepted (0ms, 1316KB)
#13: Accepted (0ms, 1316KB)
#14: Accepted (0ms, 1316KB)
#15: Accepted (0ms, 1316KB)
#16: Accepted (0ms, 1316KB)
#17: Accepted (0ms, 1316KB)
#18: Accepted (68ms, 1316KB)
#19: Accepted (84ms, 1316KB)
#20: Accepted (146ms, 1316KB)
#21: Accepted (303ms, 1316KB)
#22: Accepted (381ms, 1316KB)
#23: Accepted (475ms, 1316KB)
#24: Accepted (678ms, 1316KB)
Accepted / 100 / 2143ms / 1316KB
#02: Accepted (0ms, 1316KB)
#03: Accepted (0ms, 1316KB)
#04: Accepted (0ms, 1316KB)
#05: Accepted (0ms, 1316KB)
#06: Accepted (0ms, 1316KB)
#07: Accepted (0ms, 1316KB)
#08: Accepted (0ms, 1316KB)
#09: Accepted (0ms, 1316KB)
#10: Accepted (6ms, 1316KB)
#11: Accepted (0ms, 1316KB)
#12: Accepted (0ms, 1316KB)
#13: Accepted (0ms, 1316KB)
#14: Accepted (0ms, 1316KB)
#15: Accepted (0ms, 1316KB)
#16: Accepted (0ms, 1316KB)
#17: Accepted (0ms, 1316KB)
#18: Accepted (68ms, 1316KB)
#19: Accepted (84ms, 1316KB)
#20: Accepted (146ms, 1316KB)
#21: Accepted (303ms, 1316KB)
#22: Accepted (381ms, 1316KB)
#23: Accepted (475ms, 1316KB)
#24: Accepted (678ms, 1316KB)
Accepted / 100 / 2143ms / 1316KB
program stack_new;
uses math;
Const
maxlen=8400;
bit=10;
mbit=10000000000;
size=8;
Type
gjd=record
d:array[0..maxlen] of qword;
len:longint;
zf:boolean;
end;
TTable=array[0..100000] of longint;
Var
a:TTable;
ct,n,i,j:longint;
x,y,z,s,p:qword;
ans:gjd;
Procedure print(p:gjd);forward;
Function len(P:qword):longint;
var
s:string;
begin
str(p,s);
exit(length(s));
end;
Function initgjd(var p:gjd;k:qword):gjd;//初始化gjd置为k
begin
p.len:=0;
fillchar(p.d,(len(k) div mbit*2+2)*size,0);
p.zf:=true;
while k>0 do
begin
inc(p.len);
p.d[p.len]:=k mod mbit;
k:=k div mbit;
end;
exit(p);
end;
Function initgjd(var p:gjd):gjd;//无参数默认为0
begin
p.len:=1;
fillchar(p.d,sizeof(p.d),0);
exit(p);
end;
Procedure print(p:gjd);//输出一行高精度
var
i,j:longint;
begin
if not p.zf then write('-');
for i:=p.len downto 1 do
begin
if i<>p.len then for j:=1 to bit-len(p.d[i]) do write(0);
write(p.d[i]);
end;
end;
procedure fopen;
begin
assign(input,'stack.in');
assign(output,'stack.out');
reset(input);
rewrite(output);
end;
procedure fclose;
begin
close(input);
close(output);
end;
Procedure GetTable;
var
v:array[0..110000] of boolean;
i,j:longint;
begin
fillchar(v,sizeof(v),true);
v[1]:=false;
v[2]:=true;
ct:=0;
for i:=2 to trunc(sqrt(n*2)) do
if v[i] then
begin
inc(ct);
a[ct]:=i;
for j:=2 to n*2 div i do
v[i*j]:=false;
end;
for i:=trunc(sqrt(n*2))+1 to n*2 do
if v[i] then begin inc(ct);a[ct]:=i; end;
end;
begin
readln(n);
gettable;
{ for i:=1 to ct do
if fn2[i]>0 then
writeln(a[i],' ',fn2[i]); }
initgjd(ans,1);
for i:=1 to ct do
begin
x:=2*n;y:=n;z:=n+1;s:=1;p:=a[i];
while x>0 do
begin
x:=x div p;y:=y div p;z:=z div p;
if x>y+z then s:=s*p;
end;
if s=1 then continue;
// writeln(s);
//writeln('i=',i,' a[i]=',a[i],' ^ ',fn2[i]);
for j:=1 to ans.len do
ans.d[j]:=ans.d[j]*s;
for j:=1 to maxlen do
begin
ans.d[j+1]:=ans.d[j+1]+ans.d[j] div mbit;
ans.d[j]:=ans.d[j] mod mbit;
if (j>ans.len) and (ans.d[j+1]=0) then begin ans.len:=j;break;end;
end;
while (ans.d[ans.len]=0) and (ans.len>1) do dec(ans.len);
// print(ans);
//writeln;
end;
print(ans);
end.