Cod sursa(job #46991)

Utilizator MariusGeantaMarius Geanta MariusGeanta Data 3 aprilie 2007 12:00:41
Problema Next Scor 10
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.14 kb
{ Next/preONI 2007 runda 4 }
program sdf;
    var n,dv,r:array[0..1000000] of integer;
        d,aux,t:longint;
        f:text;
        i,control,j:integer;
        c:char;
begin
     { citire date de intrare }
     assign(f,'next.in');reset(f);
     n[0]:=0;
     while not eoln(f) do begin
           read(f,c);
           n[0]:=n[0]+1;
           val(c,n[n[0]],control);
                          end;
     readln(f);
     read(f,d);
     close(f);
     { inversez vectorii }
     for i:=1 to n[0] div 2 do begin
         aux:=n[i];
         n[i]:=n[n[0]-i+1];
         n[n[0]-i+1]:=aux;
                       end;
     { calculez n mod d }
     t:=0;i:=n[0];
     while i>0 do begin
           t:=t*10+n[i];
           t:=t mod d;
           i:=i-1;
                  end;
     { memorez pe t in vectorul R si pe d in DV }
     if t<>0 then begin
     r[0]:=0;
     repeat
           r[0]:=r[0]+1;
           r[r[0]]:=t mod 10;
           t:=t div 10;
     until t=0;
     dv[0]:=0;aux:=d;
     repeat
           dv[0]:=dv[0]+1;
           dv[dv[0]]:=aux mod 10;
           aux:=aux div 10;
     until aux=0;
     { scad pe R din DV }
     t:=0;i:=1;
     while (i<=dv[0])or(t>0) do begin
           dv[i]:=dv[i]-r[i]-t;
           if dv[i]<0 then t:=1
                      else t:=0;
           dv[i]:=dv[i]+t*10;
           i:=i+1;
                  end;
     while (dv[0]>1)and(dv[dv[0]]=0) do
           dv[0]:=dv[0]-1;
     { impart DV la D }
     t:=0;i:=dv[0];
     while i>0 do begin
           t:=(t*10+dv[i]) mod d;
           i:=i-1;
                  end;
     { adun la n pe t }
     r[0]:=0;
     repeat
           r[0]:=r[0]+1;
           r[r[0]]:=t mod 10;
           t:=t div 10;
     until t=0;
     i:=1;t:=0;
     while (i<=n[0])or(i<=r[0])or(t>0) do begin
           t:=t+n[i]+r[i];
           n[i]:=t mod 10;
           t:= t div 10;
           i:=i+1;
                  end;
     n[0]:=i-1;
     t:=100;
               end;
     { afisare }
     assign(f,'next.out');rewrite(f);
     if t=0 then write(f,0)
            else for i:=n[0] downto 1 do write(f,n[i]);
     close(f);
end.