Cod sursa(job #67616)

Utilizator vanila0406Ionescu Victor vanila0406 Data 25 iunie 2007 12:40:22
Problema Sarpe Scor 80
Compilator fpc Status done
Runda preONI 2007, Runda Finala, Clasa a 9-a si gimnaziu Marime 4.24 kb
program sarpe;
type vector=array[0..1002] of integer;
var f,g:text;
        m,va,vb,vc:vector;
        i:longint;





procedure iofile;
var c:char;
        i,aux:integer;
begin
        assign(f,'sarpe.in');
        reset(f);
        assign(g,'sarpe.out');
        rewrite(g);
        m[0]:=0;
        while not eoln(f) do
                begin
                        read(f,c);
                        if c in ['0'..'9'] then
                                begin
                                        inc(m[0]);
                                        m[m[0]]:=ord(c)-ord('0');
                                end;
                end;
        for i:=1 to m[0] div 2 do
                begin
                        aux:=m[i];
                        m[i]:=m[m[0]-i+1];
                        m[m[0]-i+1]:=aux;
                end;
        if (m[0]=1)and(m[1]=1) then
                begin
                        writeln(g,'2');
                        close(g);
                        halt;
                end;
        close(f);
end;




procedure inmultire(var v:vector;c:byte);
var t,x,i:longint;
begin
        t:=0;
        for i:=1 to v[0] do
                begin
                        x:=v[i]*c+t;
                        v[i]:=x mod 10;
                        t:=x div 10;
                end;
        while t<>0 do
                begin
                        inc(v[0]);
                        v[v[0]]:=t mod 10;
                        t:=t div 10;
                end;
end;



procedure deplasare(var v:vector;k:integer);
var i:longint;
begin
        for i:=v[0] downto 1 do
                v[i+k]:=v[i];
        for i:=1 to k do
                v[i]:=0;
        v[0]:=v[0]+k;
end;



procedure suma(var a,b:vector);
var x,i,t:longint;
begin
        t:=0;
        i:=1;
        while (i<=a[0])and(i<=b[0]) do
                begin
                        x:=a[i]+b[i]+t;
                        a[i]:=x mod 10;
                        t:=x div 10;
                        inc(i);
                end;
        if i<=a[0] then
                while i<=a[0] do
                        begin
                                x:=a[i]+t;
                                a[i]:=x mod 10;
                                t:=x div 10;
                                inc(i);
                        end else
                while i<=b[0] do
                        begin
                                x:=b[i]+t;
                                a[i]:=x mod 10;
                                t:=x div 10;
                                inc(i);
                        end;
        a[0]:=i-1;
        if t<>0 then
                begin
                        inc(a[0]);
                        a[a[0]]:=t;
                end;
end;



procedure inmultire_v(var a,b:vector);
var i:longint;
        vs,v:vector;
begin
        vs[0]:=1;
        vs[1]:=0;
        for i:=1 to b[0] do
                begin
                        v:=a;
                        inmultire(v,b[i]);
                        deplasare(v,i-1);
                        suma(vs,v);
                end;
        a:=vs;
end;


procedure scad_1(var v:vector);
var i:longint;
begin
        i:=1;
        while v[i]=0 do
                begin
                        v[i]:=9;
                        inc(i);
                end;
        v[i]:=v[i]-1;
        if v[v[0]]=0 then dec(v[0]);
end;


procedure scad_2(var v:vector);
var i,x,t:longint;
begin
        i:=1;
        x:=v[1]+10-2;
        v[1]:=x mod 10;
        t:=x div 10;
        for i:=2 to v[0]-1 do
                begin
                        x:=9+v[i]+t;
                        v[i]:=x mod 10;
                        t:= x div 10;
                end;
        v[v[0]]:=v[v[0]]-1+t;
        if v[v[0]]=0 then v[0]:=v[0]-1;
end;



begin
        iofile;
        va:=m;
        scad_1(va);
        vb:=m;
        scad_2(vb);
        inmultire_v(va,vb);
        vc[0]:=1;
        vc[1]:=2;
        inmultire_v(va,vc);
        vc[0]:=1;
        vc[1]:=4;
        inmultire_v(m,vc);
        suma(va,m);
        for i:=va[0] downto 1 do
                write(g,va[i]);
        writeln(g);
        close(g);
end.