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 C# (judge verdict: Accepted)

using System.Linq;
using System.Collections.Generic;
using System;

public static class Permi
{
    public static IEnumerable<IEnumerable<T>> Perm<T>(this IEnumerable<T> items, int? k = null)
    {
        if (k == null) k = items.Count();
        if (k == 0) yield return Enumerable.Empty<T>();
        else
        {
            var i = 0;
            foreach (var x in items)
            {
                var xs = items.Where((_, index) => i != index);
                foreach (var c in Perm(xs, k - 1))
                    yield return c.Before(x);
                i++;
            }
        }
    }
    public static IEnumerable<T> Before<T>(this IEnumerable<T> items, T first)
    {
        yield return first;
        foreach (var i in items) yield return i;
    }
}

public class hello
{
    public static void Main()
    {
        string[] line = Console.ReadLine().Trim().Split(' ');
        var a = Array.ConvertAll(line, int.Parse);
        if (a[3] == 9) { Console.WriteLine(0); goto next; }
        var b = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        var p = new List<int>();
        for (int i = 0; i < 9; i++)
            if (a[i] == -1) p.Add(i);
            else b.Remove(a[i]);
        var ans = getAns(a, b, p);
        Console.WriteLine(ans);
        next:;
    }
    public static int getAns(int[] a, List<int> b, List<int> p)
    {
        var bL = b.Count();
        var ans = 0;
        foreach (var x in b.Perm(bL))
        {
            var w = x.ToArray();
            for (int i = 0; i < bL; i++) a[p[i]] = w[i];
            if (a[3] == 9 || a[6] < a[3] || a[6] - a[3] >= 2) continue;
            if (check(a)) ans++;
        }
        return ans;
    }
    public static bool check(int[] a) => 100 * a[3] + 10 * (a[1] + a[4]) + a[0] + a[2] + a[5] == 100 * a[6] + 10 * a[7] + a[8];
}