Go: package main

import (
	"bufio"
	"os"
	"strconv"
	"fmt"
)

func solve(a, b, c int) int {
	if a == 1 && b >= c && b < 10 {
		return 1
	}
	if a == 1 {
		return 0
	}
	ret := 0
	for i := c; i < 10 && i < b; i++ {
		ret += solve(a-1, b-i, i+1)
	}
	return ret
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	for {
		scanner.Scan()
		a, _ := strconv.Atoi(scanner.Text())
		if a == 0 {
			break
		}
		scanner.Scan()
		b, _ := strconv.Atoi(scanner.Text())
		fmt.Println(solve(a, b, 0))
	}
}

C++: #include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
#include <cmath>
#include <numeric>
using namespace std;

#define REP(i,n) for(int (i)=0; (i)<(n); (i)++)
#define For(i,a,b) for(int (i)=(a); (i)<(b); (i)++)

int fact(int n) {
    if (n == 0) return 1;
    else return n * fact(n-1);
}

void solve30(int n, int s) {
    int cnt = 0;
    vector<int> data = {0,1,2,3,4,5,6,7,8,9};
    int skip = fact(10 - n);
    int i = 0;
    do {
        if (i % skip == 0) if (accumulate(data.begin(), data.begin() + n, 0) == s) {
            cnt++;
        }
        i++;
    }while (next_permutation(data.begin(), data.end()));
    cout << cnt / fact(n) << endl;
}

int main() {
    int n, s;
    while(cin >> n >> s, n + s) {
        solve30(n, s);
    }
    return 0;
}

C++: #include<iostream>
using namespace std;
int c;
int sub(int n, int x, int s, int sum){
	int i;
	if (n == 0){
		if (s == sum){
			c++;
		}
		return 0;
	}
	for (i = x; i < 10 - n; i++){
		sub(n - 1, i + 1, s, sum);
	}
}
int main(void){
	int i, n, s, sum;
	while (1){
		cin >> n >> s;
		if (n == 0 && s == 0){ break; }
		c = 0;
		sub(n, 0, s, 0);
		cout << c << endl;
	}
	return 0;
}

C++: #include<stdio.h>
int n,m;

int f(int depth, int sum, int s)
{
    if(depth == 10)
    {
        if(sum == n && s == m)return 1;
        return 0;
    }
    else return f(depth+1,sum+1,s+depth) + f(depth+1,sum,s);
}
int main()
{

    scanf("%d%d",&n,&m);
    printf("%d\n",f(0,0,0));
    return 0;
}

C++: #include <stdio.h>

int sum[10][46]={0};
int main() {
	for(int i=0; i<1<<10; i++) {
		int sumi = 0, count = 0;
		for(int j=0; j<10; j++) {
			if(i & (1<<j)) {
				sumi += j;
				count++;
			} 
		}
		sum[count][sumi]++;
	}
	
	int n = -1, s = -1;
	
	while(scanf("%d%d", &n, &s) !=EOF) {
		if(n > 10 || s > 45) printf("0\n");
		if(n == 0 && s == 0) break;
		printf("%d\n", sum[n][s]);
	}
	return 0;
}

C++: #include <iostream>

using namespace std;

int counter;

void search( int n, int s, int csum, int begin, int depth ){
  for( int i = begin; i <= 9; i++ ){
    if( depth == n && csum + i == s  ){
      counter++;
    }
    if( csum >= s ){ return; }
    search( n, s, csum + i, i + 1, depth + 1 );
  }
}

int main(){
  int n, s;
  while( 1 ){
    counter = 0;
    cin >> n >> s;
    if( !n && !s ){ return 0; }
    search( n, s, 0, 0, 1 );
    cout << counter << endl;
  }
}

C++: #include<iostream>
#include<cmath>
using namespace std;

int main(){

  int n, s, cnt;
  int num[10] = {0};
  int v[10][100] = {0};

	for(int i=1; i<1024; i++){
		cnt = 0;
		s = 0;
		for(int j=0; j<10; j++){
			if(i % (int)pow(2, j) == 0){
				num[j] = (num[j] + 1) % 2;
			}
		}
		
		for(int j=0; j<10; j++){
			if(num[j] == 1){
				cnt++;
				s += j;
			}
		}
		v[cnt][s]++;
	}
	
	while(cin >> n >> s){
		if(n == 0 && s == 0) break;
		cout << v[n][s] << endl;
	}

  return 0;

}

C++: #include<iostream>
using namespace std;

// n個の重複しない整数(min ~ max)の和としてsを表す組み合わせの数
int ci(int n, int s, int min, int max) {
  // 特殊なパターンを処理
  if (s < min || n < 1) return 0;
  if (n == 1) return (s > max)? 0: 1;
  
  // 最も小さい数で場合分けし再帰処理
  int r = 0;
  for (int i=min; i<s && i<=max; i++) r += ci(n - 1, s - i, i + 1, max);
  return r;
}

int main() {
  while (true) {
    int n, s;
    cin >> n >> s;
    if (!n && !s) break;
    cout << ci(n, s, 0, 9) << endl;
  }
  return 0;
}

C++: #include <iostream>
#include <bitset>

using namespace std;

int main() {
  int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  int n, s, sum, cnt;

  while (cin >> n >> s) {
    if (!n && !s) { break; }
    cnt = 0;
    for (int bit = 0; bit < (1 << 10); bit++) {
      sum = 0;
      for (int i = 0; i < 10; i++) {
        // if (bitset<10>(bit).test(i)) {
        // i bit 目が立っていたら, a[i] を足す
        if ((bit >> i) & 1) { sum += a[i]; }
      }
      if (sum == s && bitset<10>(bit).count() == n) { cnt++; }
    }
    cout << cnt << endl;
  }
  return 0;
}

C++: #include<iostream>
#include<cstdio>

using namespace std;

int n,s,cnt;

void solve(int now, int sum, int dep){
	if(sum==s&&dep==n){
		cnt++;
		return;
	}
	else if(sum>s||dep>n) return;
	else{
		for(int i=now+1;i<10;i++){
			solve(i,sum+i,dep+1);
		}
	}
}

int main(){
	while(scanf("%d %d",&n,&s)){
		if(n==0&&s==0)
		break;
		cnt=0;
		for(int i=0;i<10;i++){
			solve(i,i,1);
		}
		printf("%d\n",cnt);
	}
}

C++: #include<iostream>

using namespace std;

int n, s;
int c = 0;
int i = 0;
int j = 0;
int q = 0;
int date[15] = { 0 };



int sub(int start,int n,int x){
	if (x == n){
		for (int i = 0; i < n; i++){
			j = i - 1;
			/*cout << date[i];*/
			if (j>0){
				date[i] += date[j];
			}
			if (i == n - 1&&date[i]==s){
				q++;
			}
		}
		return 0;
	}

	for (int i = start; i < 10;i++){

		date[x] = i;

		sub(i + 1, n, x + 1);
	
	}


}



int main(){

	n = 0;
	while (true){
		cin >> n >> s;
		if (n == 0 && s == 0)break;
		sub(0, n, 0);


		cout << q << endl;
		q = 0;
	}
}

C++: #include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <string>
using namespace std;

#define rep(i,n) for(int i=0;i<int(n);++i)


int n,s;
int ans=0;


int solve(int c,int d,int s){
	if(c==n){
		if(s<=9&&s>=d){
			ans++;
		}
	}
	else{
		for(int i=d;i<10;i++){
			solve(c+1,i+1,s-i);
		}
	}
	return ans;
}
	
	

int main(){
	while(cin>>n>>s,n||s){
		if(s>45) cout<<"0"<<endl;
		ans = 0;
		cout << solve(1,0,s) <<endl;
	}
	return 0;
}

C++: #include <iostream>
#include <ctype.h>
#define r(i,n) for(int i;i<n;i++)
int a,b,s;
void dfs(int i,int y,int n){
  if(!n&&y==b){
    s++;
    return;
  }
  if(y>b)return;
  if(!n||i==10)return;
  dfs(i+1,y+i,n-1);
  dfs(i+1,y,n);
}
using namespace std;
int main(){
  while(cin>>a>>b,a||b){
    s=0;
    dfs(0,0,a);
    cout<<s<<endl;
  }
}

C++: #include <iostream>
using namespace std;
int main(){
  int n,s,j,k;
  int a[10][46];
  for(int s=0;s<46;s++)
  for(int n=0;n<10;n++)
    a[n][s]=0;
  for(int i=0;i<1024;i++){
    for(j=i,n=0;j>0;j/=2)n+=j%2;
    for(j=i,s=0,k=0;j>0;j/=2,k++)s+=k;
    a[n][s]++;
  }
  cin>>n>>s;
  for(;n||s;cout<<a[n][s]<<endl,cin>>n>>s);
}

C++: #include<iostream>
using namespace std;


dfs(int a,int b,int c){//a????????£???b????????????????????¨c
//c?????????
	if(b < 0)
		return 0;
	if(c < 0)
		return 0;
	if(a < 0)
		return 0;
	int n=0;
	if(b == 0 && a == 1){
		n++;
	}
	n =n + dfs(a-1,b-c,c-1) + dfs(a,b,c-1);
	return n;
}

int main(){
	int n,s;
	for(;;){
	cin >> n >> s;
	if(n==0&&s==0)
		break;
	cout << dfs(n,s,9) << endl;
	}
	return 0;
}

C++: #include<iostream>
using namespace std;

int n, s;
int ans;

void dfs(int num, int total, int minNum){
	if(num == n){
		if(total == s) ans++;
	}
	else {
		for(int i=minNum+1; i <= 9; i++){
			dfs(num+1, total+i, i);
		}
	}
}

int main(){
	while(cin >> n >> s, n||s){
		ans = 0;
		dfs(0, 0, -1);

		cout << ans << endl;
	}
}

C++: #include <iostream>
using namespace std;

// グローバル変数としてn, s, ansを定義
int n, s, ans;

void dfs(int i, int sum, int N){  // iは深さ、sumは和、Nは使用した項数
	// 最初はi,sum,Nともに0であることに注意
	
	// 使用した項数がちょうどnかつ、和がsであれば、ans++
	if(N==n && sum==s){
		ans++;
		return;
	}
	// 深さが最後まで到達または、使用した項数がnにもかかわらず和がsでなければ終了
	if(i==10){
		return;
	}
	// その数を足す
	dfs(i+1, sum+i, N+1);
	// 足さない
	dfs(i+1, sum, N);
}


int main()
{
	while(cin>>n>>s, (n!=0)&&(s!=0)){
		// ansを初期化
		ans = 0;
		dfs(0, 0, 0);
		cout<<ans<<endl;
		
	}
	return 0;
}