Cod sursa(job #68583)

Utilizator CezarMocanCezar Mocan CezarMocan Data 28 iunie 2007 15:08:40
Problema Sarpe Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.18 kb
type nr_mare=array[0..90000]of longword;
var v,x,s1,s2,s,dp,fin,rez:nr_mare;
    i,j,aux:longword;
    c:char;


procedure mult(var a,b,c:nr_mare);
var i,j:longint;
begin
c[0]:=a[0]+b[0]-1;
for i:=1 to a[0] do
        for j:=1 to b[0] do
                inc(c[i+j-1],a[i]*b[j]);
for i:=1 to c[0]-1 do
        begin
        inc(c[i+1],c[i] div 10);
        c[i]:=c[i] mod 10;
        end;
while c[c[0]]>9 do
        begin
        c[c[0]+1]:=c[c[0]] div 10;
        c[c[0]]:=c[c[0]] mod 10;
        inc(c[0]);
        end;
end;

procedure add(var a,b,c:nr_mare);
var i,j:longint;
begin
c[0]:=a[0];
if b[0]>c[0] then
        c[0]:=b[0];
for i:=1 to c[0] do
        c[i]:=a[i]+b[i];
for i:=1 to c[0]-1 do
        begin
        inc(c[i+1],c[i] div 10);
        c[i]:=c[i] mod 10;
        end;
while c[c[0]]>9 do
        begin
        c[c[0]+1]:=c[c[0]] div 10;
        c[c[0]]:=c[c[0]] mod 10;
        inc(c[0]);
        end;
end;

procedure scade(var a,b,c:nr_mare);
var i,j:longint;
begin
c[0]:=a[0];
if b[0]>c[0] then
        c[0]:=b[0];
for i:=1 to c[0] do
        begin
        if a[i]>=b[i] then
                c[i]:=a[i]-b[i]
        else
                begin
                c[i]:=a[i]+10-b[i];
                j:=i+1;
                while a[j]=0 do
                        begin
                        a[j]:=9;
                        inc(j);
                        end;
                dec(a[j]);
                end;
        end;
while c[c[0]]=0 do
        dec(c[0]);
end;


begin
assign(input,'sarpe.in');reset(input);
assign(output,'sarpe.out');rewrite(output);
while not eoln do
        begin
        read(c);
        inc(v[0]);
        v[v[0]]:=ord(c)-48;
        end;
if (v[0]=1)and(v[1]=1) then
        begin
        write('2');
        close(output);
        halt;
        end;
for i:=1 to v[0] div 2 do
        begin
        aux:=v[i];
        v[i]:=v[v[0]-i+1];
        v[v[0]-i+1]:=aux;
        end;
mult(v,v,x);
s1[0]:=1;
s1[1]:=2;
mult(x,s1,s);
mult(v,s1,s2);
scade(s,s2,fin);
s2:=dp;
s2[0]:=1;
s2[1]:=4;
add(fin,s2,rez);
for i:=rez[0] downto 1 do
        write(rez[i]);
close(input);close(output);
end.