POJ 2084 (Catalan数)

来源:互联网 发布:华为m3可以刷windows吗 编辑:程序博客网 时间:2024/06/05 22:41

卡特兰数三大公式

C(n)=C(n-1)*(4*n-2)/(n+1)

C(n)=C(2n-1,n+1)-C(2n-1,n-1)

C(n)=C(2n,n)/(n+1)


Program p2084;Const   F=10000;Type   arr=record       a:array[1..10000] of longint;       len:longint;       end;var   n,i,j:longint;   c:array[1..101] of arr;Procedure Mulpily(a:arr;b:longint;var c:arr);var   i,j:longint;begin   fillchar(c,sizeof(c),0);   for i:=1 to a.len do   begin      inc(c.a[i],a.a[i]*b);      inc(c.a[i+1],c.a[i] div F);      c.a[i]:=c.a[i] mod F;   end;   c.len:=a.len;   while c.a[c.len+1]>0 do   begin      inc(c.len);      inc(c.a[c.len+1],c.a[c.len] div F);      c.a[c.len]:=c.a[c.len] mod F;   end;   while (c.len>1) and (c.a[c.len]=0) do dec(c.len);end;Procedure Divede(a:arr;b:longint;var c:arr);var   i,j,d:longint;begin   fillchar(c,sizeof(c),0);   d:=0;   for i:=a.len downto 1 do   begin      d:=d*F+a.a[i];      c.a[i]:=d div b;      d:=d mod b;   end;   c.len:=a.len;   while (c.len>1) and (c.a[c.len]=0) do dec(c.len);end;Procedure prin(a:arr);var   i,j:longint;begin   write(a.a[a.len]);   for i:=a.len-1 downto 1 do   begin      if a.a[i]<1000 then write('0');      if a.a[i]<100 then write('0');      if a.a[i]<10 then write('0');      write(a.a[i]);   end;   writeln;end;begin   fillchar(c,sizeof(c),0);   c[1].len:=1;   c[1].a[1]:=1;   c[2].len:=1;   c[2].a[1]:=1;   for i:=3 to 101 do   begin      Mulpily(c[i-1],4*i-2,c[i]);      divede(c[i],i+1,c[i]);   end;   read(n);   while (n<>-1) do   begin      prin(c[n+1]);      read(n);   end;end.