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 AOJ
{
  class Problem0030
  {
    static void Main()
    {
      foreach (var ns in ReadNumbers())
      {
        if (ns[0] == 0 && ns[1] == 0)
          break;
        Console.WriteLine(Combination(Enumerable.Range(0, 10), ns[0], false).Where(c => c.Sum() == ns[1]).Count());
      }
    }

    static IEnumerable<int[]> ReadNumbers()
    {
      string line;
      while (!string.IsNullOrEmpty(line = Console.ReadLine()))
      {
        var sp = line.Split(' ');
        var result = new[] { 0, 0 };
        if (!string.IsNullOrEmpty(sp[0]))
          result[0] = int.Parse(sp[0]);
        if (!string.IsNullOrEmpty(sp[1]))
          result[1] = int.Parse(sp[1]);
        yield return result;
      }
    }

    static IEnumerable<T[]> Combination<T>(IEnumerable<T> elements, int n, bool isRepeated)
    {
      if (n == 1)
      {
        foreach (var el in elements)
          yield return new T[] { el };
      }
      else
      {
        foreach (var atom in elements)
        {
          var temp = elements.SkipWhile(x => !x.Equals(atom)).ToList();
          if (!isRepeated)
            temp.Remove(atom);
          var comb = Combination(temp, n - 1, isRepeated);
          foreach (var e in comb)
            yield return (new T[] { atom }).Concat(e).ToArray();
        }
      }
    }
  }
}