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.