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: Wrong Answer)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
	public static void main(String[] args){
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String tes = null;

		ArrayList<Integer> al = new ArrayList<Integer>();
		ArrayList<Integer> al2 = new ArrayList<Integer>();

		try {
			tes = br.readLine();
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}

		int a,b;
		int[] r = {0,0};
		String[] fruit = tes.split(" ", 0);
		a = Integer.parseInt(fruit[0]);
		al.add(a);
		b = Integer.parseInt(fruit[1]);
		al2.add(b);
		if(a == 0 && b == 0){
			return;
		}
		while(true){
			try {
				tes = br.readLine();
			} catch (IOException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			}
			if(tes == null){
				break;
			}

			try{
				fruit = tes.split(" ", 0);
				a = Integer.parseInt(fruit[0]);
				b = Integer.parseInt(fruit[1]);
				if(a == 0 && b == 0){
					break;
				}
				fruit = tes.split(" ", 0);
				al.add(a);
				al2.add(b);
				
			}catch(NumberFormatException e){
				break;
			}
		}
		
	
		

		int[] total = new int[1];
		
		for(int i=0;i<al.size();i++){
			total[0] = 0;
			if(al.get(i) == 9 && al2.get(i) > 864){
				System.out.println("0");
			}else if(al.get(i) == 8 && al2.get(i) > 774){
				System.out.println("0");

			}else if(al.get(i) == 7 && al2.get(i) > 679){
				System.out.println("0");

			}else if(al.get(i) == 6 && al2.get(i) > 585){
				System.out.println("0");

			}else if(al.get(i) == 5 && al2.get(i) > 490){
				System.out.println("0");

			}else if(al.get(i) == 4 && al2.get(i) > 394){
				System.out.println("0");

			}else if(al.get(i) == 3 && al2.get(i) > 297){
				System.out.println("0");

			}else if(al.get(i) == 2 && al2.get(i) > 199){
				System.out.println("0");

			}else if(al.get(i) == 1 && al2.get(i) > 100){
				System.out.println("0");
			}


			saiki(total,0,al.get(i)-1,al2.get(i),0);

			System.out.println(total[0]);
		}


	}
	public static void saiki(int[] total,int tmpgo,int kaisuu,int mokuhyou,int genkai){
		if(mokuhyou <= tmpgo){
			return;
		}
		if(kaisuu == 8 && mokuhyou > 864){
			return;
		}else if(kaisuu == 7 && mokuhyou > 774){
			return;
		}else if(kaisuu == 6 && mokuhyou > 679){
			return;
		}else if(kaisuu == 5 && mokuhyou > 585){
			return;
		}else if(kaisuu == 4 && mokuhyou > 490){
			return;
		}else if(kaisuu == 3 && mokuhyou > 394){
			return;
		}else if(kaisuu == 2 && mokuhyou > 297){
			return;
		}else if(kaisuu == 1 && mokuhyou > 199){
			return;
		}else if(kaisuu == 0 && mokuhyou > 100){
			return;
		}
		
		if(kaisuu == 0){
			for(int i=genkai;i<=100;i++){
				if(mokuhyou == (tmpgo+i)){
					total[0]++;
				}else if(mokuhyou <= (tmpgo+i)){
					return;
				}
			}
			return;
		}
		
		for(int i=genkai;i<100;i++){
			if(mokuhyou <= tmpgo){
				return;
			}
			saiki(total,tmpgo+i,kaisuu-1,mokuhyou,i+1);
		}
	}
}