Problem:
整数の和

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

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

Output

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

Sample Input

3 6
3 1
0 0

Output for the Sample Input

3
0

Solution in C++ (judge verdict: Accepted)

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

long dp[11][1001][101];
int n,s;
const int N=9;

long rec(int a, int b, int c){
	if(dp[a][b][c]>=0) return dp[a][b][c];
	
	long ret=0;	
	if(a==n && b>=0){
		if(b==0) ret=1;
		else ret=0;
	}
	else if(b<0) ret=0;
	else for(int i=c-1; i>=0; --i) ret+=rec(a+1, b-i, i);	
	
	return dp[a][b][c]=ret;
}

int main(){
	while(1){
		scanf(" %d %d", &n, &s);
		if(n==0) break;
			
		memset(dp, -1, sizeof(dp));
		printf("%ld\n", rec(0, s, N+1));
	}
}