$| = 1; use bigint; sub lift { my $n = shift; while ($n % 2 == 0) { $n /= 2; } return $n; } my @seen = (); my @pow = (); my @pref = (); sub a { my $n = shift; my $h = $pow[$n] ? 0 : 1; while (1) { my $num = $pref[$n] + (2**$pow[$n]) * $h; my $odd = lift($num); if ($seen[$odd]) { $h++; } else { $seen[$odd] = 1; my $p = 0; my $rem = $h; while ($rem) { my $d = $rem % 2; $rem = ($rem - $d)/2; if ($d && $p) { if ($pow[$n+$p]==0) { $pow[$n+$p] = $p; } $pref[$n+$p] += 2**($pow[$n+$p]-$p); } $p++; } return $num * 2**($n-1-$pow[$n]); } } } foreach my $n (1..10_000) { my $a = a($n); last if $a >= 10**1000; print "$n $a\n"; }