uses math;
type number = array[1..20001] of integer;
var a, b, c : number;
na, nb, nc : integer;
// in ra số 'a'. Số 'a' có 'na' chữ số.
procedure printNumber(a : number; na : integer);
var i : integer;
begin
for i := na downto 1 do
write(a[i]);
writeln;
end;
// tính tổng của 2 số 'a' và 'b', với 'b' đc dịch sang bên trái 'offset' chữ số.
// kết quả đc lưu vào số 'a'.
procedure sum(var a, b : number; var na : integer; nb, offset : integer);
var i, carry, k, xa, xb, nrs : integer;
begin
k := max(na, nb + offset);
carry := 0;
nrs := 0;
for i := 1 to k do
begin
xa := 0;
if (i <= na) then
xa := a[i];
xb := 0;
if (offset < i) and (i <= nb + offset) then
xb := b[i - offset];
inc(nrs);
a[nrs] := xa + xb + carry;
carry := a[nrs] div 10;
a[nrs] := a[nrs] mod 10;
end;
if (carry > 0) then
begin
inc(nrs);
a[nrs] := 1;
end;
na := nrs;
end;
// nhân số 'a' với 1 chữ số 'digit'. Kết quá đc lưu ở 'c' với 'nc' chữ số.
procedure multiply_digit(a : number; na, digit : integer; var c : number; var nc : integer);
var i, carry : integer;
begin
nc := 0;
carry := 0;
for i := 1 to na do
begin
inc(nc);
c[nc] := a[i] * digit + carry;
carry := c[nc] div 10;
c[nc] := c[nc] mod 10;
end;
if (carry > 0) then
begin
inc(nc);
c[nc] := carry;
end;
end;
// nhân 2 số lớn 'a' và 'b'. Kết quả đc lưu ở 'c' với 'nc' chữ số.
procedure multiply(a, b : number; na, nb : integer; var c : number; var nc : integer);
var i, nd : integer;
d : number;
begin
multiply_digit(a, na, b[1], c, nc);
for i := 2 to nb do
begin
multiply_digit(a, na, b[i], d, nd);
sum(c, d, nc, nd, i - 1);
end;
end;
BEGIN
a[1] := 3; a[2] := 4; a[3] := 8; na := 3; // 843
b[1] := 7; b[2] := 0; b[3] := 9; b[4] := 1; nb := 4; // 1907
multiply(a, b, na, nb, c, nc);
printNumber(c, nc);
END.