#!/usr/bin/perl
use 5.016;
use warnings;

sub rest { [ @{$_[0]}[ 1 .. $#{$_[0]} ] ] }

sub f {
	my ($m, $n) = @_;

	my $len = length($m . $n);

	my ($t, $r) = sub {
		my ($l, $s, $z, $r, $t) = @_;

		@{$l} or return ($t, $r);

		$l->[0] or return __SUB__->(rest($l), $s, $z + 1, $r, $t);

		my $x = $m * $l->[0] * 10 ** $z;
		my $u = $t + $x * 10 ** $s;
		return __SUB__->(
			rest($l), $s + $z + 1, 0, [@{$r}, [$len - $s, $x]], $u
		);
	}->([ reverse split //, $n ], 0, 0, [], 0);

	return map{ ' ' x ($_->[0] - length($_->[1])) . $_->[1] . "\n" } (
		[$len, $m],
		[$len, 'x' . ' ' x ($len - length($n) - 1) . $n],
		[$len, '-' x $len],
		@{$r},
		[$len, '-' x $len],
		[$len, $t]
	);
}

say f(1234, 567);
say f(1234, 1001);
say f(123, 10101);
