SETNJA - Setnja

Tác giả: flashmt

Ngôn ngữ: Pascal

const base=100000000;
      digit=8;
type bignum=array[0..875] of longint;
var num,re,temp:bignum;

procedure plus(var c:bignum;a,b:bignum);
var i,max,mem:longint; 
begin
     mem:=0;
     if a[0]>b[0] then max:=a[0] else max:=b[0];
     for i:=1 to max do
     begin
          c[i]:=a[i]+b[i]+mem;
          if c[i]<base then mem:=0
          else
          begin
               c[i]:=c[i]-base; mem:=1;
          end;
     end;
     if mem>0 then
     begin
          max:=max+1;
          c[max]:=mem;
     end;
     c[0]:=max;
end;

procedure plus1(var c:bignum;a,b,d:bignum);
var i,max,mem:longint; 
begin
     mem:=0;
     if a[0]>b[0] then max:=a[0] else max:=b[0];
     if max<d[0] then max:=d[0];
     for i:=1 to max do
     begin
          c[i]:=a[i]+b[i]+d[i]+mem;
          if c[i]<base then mem:=0
          else
          begin
               mem:=c[i] div base; c[i]:=c[i] mod base; 
          end;
     end;
     if mem>0 then
     begin
          max:=max+1;
          c[max]:=mem;
     end;
     c[0]:=max;
end;

procedure multi(var c:bignum;a:bignum;b:longint);
var i,max,mem:longint; 
begin
     mem:=0; max:=a[0];
     for i:=1 to max do
     begin
          c[i]:=a[i]*b+mem;
          if c[i]<base then mem:=0
          else
          begin
               mem:=c[i] div base; c[i]:=c[i] mod base; 
          end;
     end;
     if mem>0 then
     begin
          max:=max+1;
          c[max]:=mem;
     end;
     c[0]:=max;
end;

procedure mul2(var c:bignum;a:bignum;b:longint);
var i,max,mem:longint; 
begin
     mem:=0; max:=a[0];
     for i:=1 to max do
     begin
          c[i]:=a[i] shl b+mem;
          if c[i]<base then mem:=0
          else
          begin
               mem:=1; c[i]:=c[i]-base; 
          end;
     end;
     if mem>0 then
     begin
          max:=max+1;
          c[max]:=mem;
     end;
     c[0]:=max;
end;

procedure multi1(var c:bignum;a:bignum;b:longint;d:bignum);
var i,max,mem:longint; 
begin
     mem:=0; 
     if a[0]>=d[0] then max:=a[0] else max:=d[0];
     for i:=1 to max do
     begin
          c[i]:=a[i]*b+d[i]+mem;
          if c[i]<base then mem:=0
          else
          begin
               mem:=c[i] div base; c[i]:=c[i] mod base; 
          end;
     end;
     if mem>0 then
     begin
          max:=max+1;
          c[max]:=mem;
     end;
     c[0]:=max;
end;

procedure mul21(var c:bignum;a:bignum;b:longint;d:bignum);
var i,max,mem:longint; 
begin
     mem:=0; 
     if a[0]>=d[0] then max:=a[0] else max:=d[0];
     for i:=1 to max do
     begin
          c[i]:=a[i] shl b+d[i]+mem;
          if c[i]<base then mem:=0
          else
          begin
               mem:=c[i] div base; c[i]:=c[i] mod base; 
          end;
     end;
     if mem>0 then
     begin
          max:=max+1;
          c[max]:=mem;
     end;
     c[0]:=max;
end;

procedure star;
var i:longint;
begin
     multi1(re,re,5,num);
     multi(num,num,3);
end;

procedure rf;
var c:char;
begin
     num[0]:=1; re[0]:=1; re[1]:=1; num[1]:=1;
     while not eoln do
     begin
          read(c);
          if c='P' then continue;
          if c='*' then star
          else
          begin
               if c='L' then mul2(re,re,1) else mul21(re,re,1,num);
          end;
     end;
end;

procedure wf;
var i,j,t:longint; s:string;
begin
     for i:=re[0] downto 1 do
     begin
          if i<re[0] then
          begin
               str(re[i],s);
               t:=length(s);
               for j:=t+1 to digit do write(0);
          end;
          write(re[i]);
     end;
end;

begin
     rf;
     wf;
end.

Download