#!/bin/perl use Math::BigInt; select((select(STDOUT), $| = 1)[0]); #======================================================================= my $zero = new Math::BigInt(0); my $one = new Math::BigInt(1); my $ten = new Math::BigInt(10); #======================================================================= my %h = (0, $one); sub h { my ($n) = @_; return $h{$n} if $h{$n}; my $s = $zero; my $t = $one; my ($x, $y) = ($n, 1); for (my ($x, $y) = ($n, 1); $x > 0;) { $t *= $x--, $t /= $y++; $s += $t*h($x); } return $h{$n} = $s; } sub fbase { my @p = @_; my @i = (0, (0) x @p); my $s = $zero; # $s = grep($_ != 1, @p) ? $zero : $one; for (;;) { for (@i) { last if $_ = -1-$_; } last if $i[@p]; @q = map($p[$_]+$i[$_], 0..$#p); my $c = eval join("*", -2, grep($_, @i)); $s += $c*f(@q); } return $s; } sub f { my (@p) = (sort {$a <=> $b} grep($_, @_)); return h(int(@p)) unless grep($_ != 1, @p); return 0 if $p[0] < 0; my $f = $f{"@p"}; return $f ? $f : ($f{"@p"} = fbase(@p)); } print f(@ARGV), "\n";