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 JAVA (judge verdict: Accepted)

import java.util.*;
import java.io.*;

public class Main {
	public void solve() throws IOException {
		int n = nextInt();
		int s = nextInt();
		long[][][] dp2 = new long[10][1001][101];
		for(int i = 0; i <= 100; i++){
			dp2[1][i][i] = 1;
		}
		for(int i = 2; i <= 9; i++){
			for(int j = 0; j <= 1000; j++){
				for(int k = 0; k <= 100; k++){
					if( dp2[i-1][j][k] > 0 ){
						for(int l = k+1; l <= 100 && j+l <= 1000; l++){
							dp2[i][j+l][l] += dp2[i-1][j][k];
						}
					}
				}
			}
		}
		long[][] ans = new long[10][1001];
		for(int i = 1; i <= 9; i++){
			for(int j = 0; j <= 1000; j++){
				for(int k = 0; k <= 100; k++){
					ans[i][j] += dp2[i][j][k];
				}
			}
		}
	/*	long[][][] dp = new long[10][10][1010];
		for(int i = 1; i <= 9; i++){
			dp[i][0][0] = 1;
			for(int j = 1; j <= i; j++){
				for(int k = 0; k < dp[i][j].length; k++){
					if( dp[i][j-1][k] > 0 ){
						for(int l = 1; l <= 100 && k+l < dp[i][j].length; l++){
							int idx = (i-j+1)*l+k;
							if( idx >= dp[i][j].length ){
								break;
							}
							dp[i][j][idx] += dp[i][j-1][k];
						}
					}
				}
			}
		}*/
		while( n != 0 || s != 0 ){
			writer.println(ans[n][s]);
			writer.flush();
			n = nextInt();
			s = nextInt();
		}
		writer.flush();
	/*	for(int i = 1; i < 10; i++){
			for(int j = 0; j < 20; j++){
				writer.println("i = " + i + ", j = " + j + ", " + dp[i][i][j+i]);
			}
		}*/
	}

	public static void main(String[] args) throws IOException {
		new Main().run();
	}

	BufferedReader reader;
	StringTokenizer tokenizer;
	PrintWriter writer;

	public void run() throws IOException {
		try {
			reader = new BufferedReader(new InputStreamReader(System.in));
			tokenizer = null;
			writer = new PrintWriter(System.out);
			solve();
			reader.close();
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String nextToken() throws IOException {
		while (tokenizer == null || !tokenizer.hasMoreTokens()) {
			tokenizer = new StringTokenizer(reader.readLine());
		}
		return tokenizer.nextToken();
	}

	public int nextInt() throws IOException {
		return Integer.parseInt(nextToken());
	}
}