Problem:
整数の和 II

0 から 100 の数字から異なる n 個の数を取り出して合計が s となる組み合わせの数を出力するプログラムを作成してください。n 個の数はおのおの 0 から 100 までとし、１つの組み合わせに同じ数字は使えません。たとえば、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 ≤ 1000 ) が１つのスペースで区切られて１行に与えられます。n と s が共に 0 のとき入力の最後とします。

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

Output

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

組み合わせの数が 1010を超える入力は与えられません。

Sample Input

3 6
3 1
0 0

Output for the Sample Input

3
0

Solution in C (judge verdict: Wrong Answer)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 9
#define S 1000
#define K 100

static int k_operafan[ N + 1 ][ S + 1 ][ K + 1 ];

int
dpFSA (
  const int n,
  const int s,
  const int k
  )
{
  int i;

  if ( n == 0 ) return ( s == 0 ? 1 : 0 );
  if ( s < 0 )  return ( 0 );

  if ( ~k_operafan[ n ][ s ][ k ] ) ;
  else
  {
    k_operafan[ n ][ s ][ k ] = 0;

    for ( i = k; i <= 100; ++i )
    {
      k_operafan[ n ][ s ][ k ] += dpFSA ( n - 1, s - i, i + 1 );
    }
  }

  return ( k_operafan[ n ][ s ][ k ] );
}

int
main (
  int   argc,
  char *argv[ ]
  )
{
  memset ( k_operafan, -1, sizeof ( k_operafan ) );

  for ( ; ; )
  {
    int n, s;

    scanf ( "%d%d", &n, &s );
    if ( n == 0 && s == 0 )
      break ;

    printf ( "%d\n", dpFSA ( n, s, 0 ) );
  }

  return ( EXIT_SUCCESS );
}