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: Accepted)

#include <stdio.h>
#define N_MAX 9
#define S_MAX 1000
#define V_MAX 100

int main(void)
{
    int n, s, v, v_max;

    static long int dp[N_MAX + 1][S_MAX + 1][V_MAX + 1];

    /* n = 1 */
    for(v_max = 0; v_max <= V_MAX; v_max++)
        for(s = 0; s <= v_max; s++)
            dp[1][s][v_max] = s <= v_max;

    /* n >= 2 */
    for(n = 2; n <= N_MAX; n++)
        for(s = 0; s <= S_MAX; s++)
            for(v_max = 0; v_max <= V_MAX; v_max++)
            {
                long int sum = 0;
                for(v = 1; v <= s && v <= v_max; v++)
                    sum += dp[n - 1][s - v][v - 1];
                dp[n][s][v_max] = sum;
            }

    while(scanf("%d %d", &n, &s), n + s)
        printf("%ld\n", dp[n][s][V_MAX]);

    return 0;
}