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 <iostream>
#include <cstdio>

using namespace std;

const int MAX_NUM = 110;
const int MAX_SIZE = 15;
const int MAX_SUM = 1010;
const int INF = 1e9;
int n, s;
int memo[MAX_NUM][MAX_SIZE][MAX_SUM];

// memoをINFで初期化
void Init()
{
    for (int i = 0; i < MAX_NUM; i++)
        for (int j = 0; j < MAX_SIZE; j++)
            for (int k = 0; k < MAX_SUM; k++)
                memo[i][j][k] = INF;
}

// 0〜 (num - 1)までの数字をsize個選んだ時の和がsum
int Recursion(int num, int size, int sum)
{
    if (memo[num][size][sum] != INF)
        return memo[num][size][sum];

    if (num > 100 || size > n || sum > s)
        return 0;
    if (size == n && sum == s)
        return 1;

    int res = 0;
    // 数字numを加算した場合
    res += Recursion(num + 1, size + 1, sum + num);

    // 数字numを加算しない場合
    res += Recursion(num + 1, size, sum);

    return memo[num][size][sum] = res;
}

int main()
{
    while (cin >> n >> s, n || s) {
        Init();
        cout << Recursion(0, 0, 0) << endl;
    }

    return 0;
}