Problem:
整数の和

0 から 9 の数字から異なる n 個の数を取り出して合計が s となる組み合わせの数を出力するプログラムを作成してください。n 個の数はおのおの 0 から 9 までとし、１つの組み合わせに同じ数字は使えません。たとえば、n が 3 で s が 6 のとき、3 個の数字の合計が 6 になる組み合わせは、

1 + 2 + 3 = 6

0 + 1 + 5 = 6

0 + 2 + 4 = 6

の 3 通りとなります。

Input

複数のデータセットが与えられます。各データセットに n (1 ≤ n ≤ 9) と s (0 ≤ s ≤ 100) が１つのスペースで区切られて１行に与えられます。n と s が共に 0 のとき入力の最後とします（この場合は処理せずにプログラムを終了する）。

データセットの数は 50 を超えません。

Output

各データセットに対して、n 個の整数の和が s になる組み合わせの数を１行に出力して下さい。

Sample Input

3 6
3 1
0 0

Output for the Sample Input

3
0

Solution in C# (judge verdict: Accepted)

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

namespace AOJ0030
{
    class Program
    {
        static void Main()
        {
            foreach (var values in ReadInputs())
            {
                Console.WriteLine(Choose(values[0], values[1]).Count());
            }
        }

        public static IEnumerable<int[]> ReadInputs()
        {
            string line;
            while ((line = Console.ReadLine()) != null && line != "0 0")
            {
                yield return line.Split(' ').Select(int.Parse).ToArray();
            }
        }

        public static IEnumerable<int[]> Choose(int n, int s)
        {
            if (n < 0 || n >= 10) throw new ArgumentOutOfRangeException();

            return Choose(n, s, new List<int>());
        }

        private static IEnumerable<int[]> Choose(int n, int s, List<int> choosen)
        {
            if (n == 0)
            {
                if (choosen.Sum() == s)
                {
                    yield return choosen.ToArray();
                }

                yield break;
            }

            if (choosen.Sum() > s)
            {
                yield break;
            }

            // やりすぎじゃないかな
            foreach (var item in from number in Enumerable.Range(0, 10)
                                 where !choosen.Any() || number > choosen.Max()
                                 let newChoosen = new List<int>(choosen) {number}
                                 from result in Choose(n - 1, s, newChoosen)
                                 select result)
            {
                yield return item;
            }
        }
    }
}