Program gfdg; const M=501; type pole= array [1..M] of integer; var p1,p2,p3,p4,p5:pole; i,j,n:integer; c,oper:char; procedure tisk(p:pole); var i:integer; begin { for i:=p[m] downto 1 do write(p[i]); writeln;} end; procedure tisk2(p:pole;k:integer); var i:integer; begin for i:=1 to k-p[m] do write(' '); for i:=p[m] downto 1 do write(p[i]); writeln; end; procedure tisk3(p:pole;k:integer;c:char); var i:integer; begin for i:=1 to k-p[m]-1 do write(' '); write(c); for i:=p[m] downto 1 do write(p[i]); writeln; end; procedure cara(l,k:integer); var i:integer; begin for i:=1 to l do write(' '); for i:=k-l downto 1 do write('-'); writeln; end; procedure plusko(var p1,p2,p3:pole); var i,max,posun,pom:integer; begin if p1[M]>p2[M] then max:=p1[M] else max:=p2[M]; {nulovani neni zatimn} for i:=p1[M]+1 to max do p1[i]:=0; for i:=p2[M]+1 to max do p2[i]:=0; posun:=0; for i:=1 to max do begin pom:=p1[i]+p2[i]+posun; posun := pom div 10; p3[i]:=pom mod 10; end; if posun>0 then begin p3[i+1]:=posun; p3[M]:=max+1; end else p3[M]:=max; end; procedure minusko(var p1,p2,p3:pole); var i,max,posun,pom:integer; begin if p1[M]>p2[M] then max:=p1[M] else max:=p2[M]; {nulovani neni zatimn} for i:=p1[M]+1 to max do p1[i]:=0; for i:=p2[M]+1 to max do p2[i]:=0; posun:=0; for i:=1 to max do begin pom:=p1[i]-p2[i]-posun; if pom<0 then begin posun := 1 ; p3[i]:=pom+10; end else begin posun:=0; p3[i]:=pom; end; end; p3[M]:=max; for i:=max downto 1 do if p3[i]=0 then dec(p3[M]) else break; end; procedure nasob1(var p1,p3:pole; a:integer); var pom,i,posun,max:integer; begin posun:=0; max:=p1[M]; for i:=1 to max do begin pom:=a*p1[i]+posun; posun := pom div 10; p3[i]:=pom mod 10; end; if posun>0 then begin p3[i+1]:=posun; p3[M]:=max+1; end else p3[M]:=max; end; procedure nasob(var p1,p2,p3:pole;vypis:boolean;k:integer); var pom,i,max,posun:integer; p4,p5:pole; begin if k=p2[m] then inc(k); if vypis then begin if p1[M]>p2[M]+1 then max:=p1[m] else max:=p2[m]+1; tisk2(p1,max); tisk3(p2,max,'*'); cara(k-max,k); end; max:=p2[M]; p3[1]:=0; p3[M]:=1; for i:=1 to max do begin if p2[i]<>0 then nasob1(p1,p4,p2[i]); if vypis and (p2[M]>1) then begin tisk2(p4,k-i+1); end; for j:=p4[M] downto 1 do p4[j+i-1]:=p4[j]; for j:=1 to i-1 do p4[j]:=0; p4[M]:=p4[M]+i-1; { tisk(p4);} plusko(p3,p4,p5); p3:=p5; end; if vypis then begin cara(0,k); tisk2(p3,k); end; end; var pom,max:integer; begin readln (n); for i:=1 to n do begin read(c); j:=1; while (c<>'+')and(c<>'-')and(c<>'*') do begin p1[j]:=ord(c)-ord('0'); j:=j+1; read(c); end; p1[M]:=j-1; oper:=c; read(c); j:=1; while not eoln do begin p2[j]:=ord(c)-ord('0'); j:=j+1; read(c); end; p2[j]:=ord(c)-ord('0'); p2[M]:=j; for j:=1 to p1[M] div 2 do begin pom:= p1[j]; p1[j]:=p1[p1[M]-j+1]; p1[p1[M]-j+1]:=pom; end; for j:=1 to p2[M] div 2 do begin pom:= p2[j]; p2[j]:=p2[p2[M]-j+1]; p2[p2[M]-j+1]:=pom; end; tisk(p1); tisk(p2); if oper='+' then plusko(p1,p2,p5); if oper='-' then minusko(p1,p2,p5); if oper='*' then begin nasob(p1,p2,p5,false,0); tisk(p5); nasob(p1,p2,p5,p2[M]>1,p5[M]); end; if (oper='+') or (oper='-') or ((oper='*') and (p2[M]=1)) then begin if p1[M]>p2[M]+1 then max:=p1[M] else max:=p2[M]+1; if max