Cod sursa(job #6325)

Utilizator CezarMocanCezar Mocan CezarMocan Data 18 ianuarie 2007 21:02:04
Problema Patrate2 Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.47 kb
type vector=array[0..10010]of longint;
var i,j,n,m:longint;
    fact,v,x,desc:vector;
    pow:array[1..20]of vector;

procedure inmultire(nr:longint;var v:vector);
var i,m:longint;
begin
  m:=0;
  for i:=1 to v[0] do begin
    v[i]:=v[i]*nr;
    inc(v[i],m);
    m:=v[i] div 10;
    v[i]:=v[i] mod 10;
  end;
  while m>0 do begin
    inc(v[0]);v[v[0]]:=m mod 10;
    m:=m div 10;
  end;
end;

procedure inmultire_mari(v,fact:vector;var x:vector);
var i,j,m:longint;
begin
  m:=0;
  for i:=1 to fact[0] do
    for j:=1 to v[0] do inc(x[i+j-1],v[j]*fact[i]);
  x[0]:=v[0]+fact[0]-1;
  for i:=1 to x[0] do begin
    x[i]:=x[i]+m;
    m:=x[i] div 10;
    x[i]:=x[i] mod 10;
  end;
  while m<>0 do begin
    inc(x[0]);
    x[x[0]]:=m mod 10;
    m:=m div 10;
  end;
end;

begin
  assign(input,'patrate2.in');reset(input);
  assign(output,'patrate2.out');rewrite(output);
  readln(n);m:=sqr(n);
  while m>0 do begin
    inc(desc[0]);
    desc[desc[0]]:=m mod 2;
    m:=m div 2;
  end;
  pow[1,0]:=1;pow[1,1]:=2;
  for i:=2 to desc[0] do
    inmultire_mari(pow[i-1],pow[i-1],pow[i]);
  v[0]:=1;v[1]:=1;
  for i:=1 to desc[0] do begin
    if desc[i]=1 then begin inmultire_mari(pow[i],v,x);v:=x;end;
    for j:=1 to x[0] do x[j]:=0;
  end;
  for i:=1 to x[0] do x[0]:=0;
  x[0]:=0;
  fact[0]:=1;fact[1]:=1;
  for i:=2 to n do inmultire(i,fact);
  inmultire_mari(v,fact,x);
  for i:=x[0] downto 1 do write(x[i]);
  close(input);close(output);
end.