use 5.010; sub dalu { no warnings "uninitialized"; my($a, $b, $n, $o) = @_; my @b = @$b; my $c = $n && 1; for (my $k = 0; @b || $k < @$a || $c && !$n; $k++) { my $y = shift @b; $n and $y = 9 - $y; $c = 10 <= (my $z = $$a[$k] + $c + $y); $o or $$a[$k] = $z % 10; } $c; } my $n = [reverse split //, "4335043554366887798866555766"]; my $p = [1]; my $e = 0; while (dalu $n, $p, 1, 1) { dalu $p, $p for 0..3; $e++; } my $r; for my $_e (0 .. $e - 1) { dalu $n, $n for 0..3; my $i = 0; while (dalu $n, $p, 1, 1) { dalu $n, $p, 1; $i++; } $r .= sprintf "%x", $i; } say $r; __END__