Cod sursa(job #187513)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 4 mai 2008 13:48:03
Problema Sarpe Scor 70
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.22 kb
type vector =array[0..1010] of integer;
var b,a,c,v1,v2,vn,v,d :vector;
    lgv,lga,lgb,lgc,lgv1,lgv2,lgd,lgvn,z : integer;
    i,j,n : integer;
    f,g : text;
    cc : char;
function mult(a,b : integer):longint;
var rez : longint;
begin
        rez:=0;
        while a<>0 do
        begin
          if a and 1=1 then rez:=rez+b;
          a:=a shr 1;
          b:=b shl 1;
        end;
        mult:=rez;
end;

procedure inmultire(var c : vector;a : vector;var lga : integer;b:vector;lgb:integer);
var i,j,t : integer;
begin
  for i:=1 to lga do
    for j:=1 to lgb do
      c[j+i-1]:=c[j+i-1]+mult(a[i],b[j]);
t:=0;
  for i:=1 to lga+lgb-1 do
  begin
    c[i]:=c[i]+t;
    t:=c[i] div 10;
    c[i]:=c[i] mod 10;
  end;
  z:=lga+lgb-1;
  if t <>0 then
  begin
    c[lga+lgb]:=t;
    inc(z);
  end;
end;

procedure adunare(var a: vector;b : vector;var lga:integer;lgb :integer);
var i,t : integer;
begin
t:=0; i:=1;
while (i<=lga)or(i<=lgb)or(t<>0)do
begin
  t:=t div 10;
  t:=t+a[i]+b[i];
  a[i]:=t mod 10;
  inc(i);
end;
dec(i,2);
lga:=i;
if a[i]=0 then lga:=i-1;
end;

procedure scadere(var a: vector;b : vector;var lga:integer;lgb :integer);
var i,t : integer;
begin
t:=0;
  for i:=1 to lga do
  begin
    a[i]:=t+a[i]+10-b[i];
    dec(a[i+1]);
    t:=a[i] div 10;
    a[i]:=a[i] mod 10;
  end;
  while (lga>1)and(a[lga]=0)do
    dec(lga);
  a[lga+1]:=0;
end;

begin
  assign(f,'sarpe.in');reset(f);
  assign(g,'sarpe.out');rewrite(g);
  while not eof(f) do
  begin
    while not eoln(f) do
    begin
      read(f,cc);
      inc(n);
      vn[n]:=ord(cc)-48;
    end;
    readln(f);
  end;
  for i:=1 to n div 2 do
  begin
    vn[i]:=vn[i] xor vn[n-i+1];
    vn[n-i+1]:=vn[n-i+1] xor vn[i];
    vn[i]:=vn[i] xor vn[n-i+1];
  end;
 b[1]:=1;lgb:=1;
 v1:=vn; lgv1:=n;
 scadere(v1,b,lgv1,lgb); { in v1 am n-1 }
 v2:=vn; lgv1:=n;
 b[1]:=2; lgv2:=n;
 scadere(v2,b,lgv2,lgb); { in v2 am n-2 }
 inmultire(c,v1,lgv1,v2,lgv2); { in c am (n-1)(n-2) };
 lgc:=z;
 inmultire(d,c,lgc,b,lgb); { in d am 2(n-1)(n-2) };
 lgd:=z;
 b[1]:=4;
 inmultire(v,vn,n,b,lgb);
 lgv:=z;
 adunare(v,d,lgv,lgd);
 for j:=lgv downto 1 do write(g,v[j]);
 writeln(g);
 close(g);
end.