Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

虫食い算

足し算は筆算で簡単に計算できますが、もし、いくつかの数字が欠けていたら、欠けている数字を埋めるのは簡単でしょうか？ 例えば、以下のような筆算において、１から９の数字が一度しか現れないという条件があるとき、ＣとＥのマスに入る数字はいくつになるでしょう？ この場合、Ｃに入るのは８，Ｅに入るのは５が正解となります。このように、数字がいくつか欠けている演算を虫食い算と呼びます。

１から９の数字が一度しか現れないという条件はそのままで、以下のようにもっとたくさんの数字が欠けていたら、正解となる数字の埋め方は一通りしかないのでしょうか？ 実は、必ず一通りに決まるとは限りません。

上の図のような形をした虫食い算の、ＡからＩの各マスの情報が与えられたとき、正しい埋め方が何通りあるかを出力するプログラムを作成せよ。

Input

入力は以下の形式で与えられる。

A B C D E F G H I

１行に、虫食い算の Ａ から Ｉ のマスに入っている数字の情報が与えられる。ただし、与えられた値が -1 のときは、そのマスの数字が欠けていることを表す。-1 以外の値は、1 から 9 の整数のいずれかで、それらの間に重複はない。

Output

正しい埋め方が何通りあるかを１行に出力する。

Sample Input 1

7 6 -1 1 -1 9 2 3 4

Sample Output 1

1

Sample Input 2

7 6 5 1 8 9 2 3 4

Sample Output 2

0

Sample Input 3

-1 -1 -1 -1 -1 -1 8 4 6

Sample Output 3

12

Sample Input 4

-1 -1 -1 -1 -1 -1 -1 -1 -1

Sample Output 4

168

Solution in Ruby (judge verdict: Accepted)

a = gets.split.map(&:to_i)
s = "%d+%d%d+%d%d%d==%d%d%d"
nums = (1..9).to_a - a.select {|x| x != -1}
if nums.empty?
    p eval(sprintf(s, *a)) ? 1 : 0
else
    k = 0
    nums.permutation(nums.size) do |perm|
        d = a.dup
        perm.each do |k|
            d[d.index{|x| x < 0}] = k
        end
        k += 1 if eval(sprintf(s, *d))
    end
    p k
end