火车进出栈问题(强化版)

描述 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
 
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.
原文地址:https://www.cnblogs.com/htfy/p/2738585.html