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>
using namespace std;

int main(){
	int n,m;
	while(cin>>n>>m){
		if(n==0&&m==0)break;
		int last=0;
		if(n==1){
			for(int i=0;i<10;i++){
				if(i==m)last++;
			}
		}
		else if(n==2){
			for(int i=0;i<10;i++){
				for(int j=i+1;j<10;j++){
					if(i+j==m)last++;
				}
			}
		}
		else if(n==3){
			for(int i=0;i<10;i++){
				for(int j=i+1;j<10;j++){
					for(int k=j+1;k<10;k++){
						if(i+j+k==m)last++;
					}
				}
			}
		}
		else if(n==4){
			for(int i=0;i<10;i++){
				for(int j=i+1;j<10;j++){
					for(int k=j+1;k<10;k++){
						for(int l=k+1;l<10;l++){
							if(i+j+k+l==m)last++;
						}
					}
				}
			}
		}
		else if(n==5){
			for(int i=0;i<10;i++){
				for(int j=i+1;j<10;j++){
					for(int k=j+1;k<10;k++){
						for(int l=k+1;l<10;l++){
							for(int p=l+1;p<10;p++){
								if(i+j+k+l+p==m)last++;
							}
						}
					}
				}
			}
		}
		else if(n==6){
			for(int i=0;i<10;i++){
				for(int j=i+1;j<10;j++){
					for(int k=j+1;k<10;k++){
						for(int l=k+1;l<10;l++){
							for(int p=l+1;p<10;p++){
								for(int o=p+1;o<10;o++){
									if(i+j+k+l+p+o==m)last++;
								}
							}
						}
					}
				}
			}
		}
		else if(n==7){
			for(int i=0;i<10;i++){
				for(int j=i+1;j<10;j++){
					for(int k=j+1;k<10;k++){
						for(int l=k+1;l<10;l++){
							for(int p=l+1;p<10;p++){
								for(int o=p+1;o<10;o++){
									for(int u=o+1;u<10;u++){
										if(i+j+k+l+p+o+u==m)last++;
									}
								}
							}
						}
					}
				}
			}
		}
		else if(n==8){
			for(int i=0;i<10;i++){
				for(int j=i+1;j<10;j++){
					for(int k=j+1;k<10;k++){
						for(int l=k+1;l<10;l++){
							for(int p=l+1;p<10;p++){
								for(int o=p+1;o<10;o++){
									for(int u=o+1;u<10;u++){
										for(int y=u+1;y<10;y++){
											if(i+j+k+l+p+o+u+y==m)last++;
										}
									}
								}
							}
						}
					}
				}
			}
		}
		else if(n==9){
			for(int i=0;i<10;i++){
				for(int j=i+1;j<10;j++){
					for(int k=j+1;k<10;k++){
						for(int l=k+1;l<10;l++){
							for(int p=l+1;p<10;p++){
								for(int o=p+1;o<10;o++){
									for(int u=o+1;u<10;u++){
										for(int y=u+1;y<10;y++){
											for(int t=y+1;t<10;t++){
												if(i+j+k+l+p+o+u+y+t==m)last++;
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		else{
			for(int i=0;i<10;i++){
				for(int j=i+1;j<10;j++){
					for(int k=j+1;k<10;k++){
						for(int l=k+1;l<10;l++){
							for(int p=l+1;p<10;p++){
								for(int o=p+1;o<10;o++){
									for(int u=o+1;u<10;u++){
										for(int y=u+1;y<10;y++){
											for(int t=y+1;t<10;t++){
												for(int q=t+1;q<10;q++){
													if(i+j+k+l+p+o+u+y+t+q==m)last++;													
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		cout<<last<<endl;
	}
}

C++: #include <iostream>
#include <algorithm>
using namespace std;
 
int rec(int n, int p, int s) {
  if(s < 0) return 0;
  if(n == 0) return s == 0;
  int res = 0;
  for(; p <= 9; ++p) {
    res += rec(n-1, p+1, s-p);
  }
  return res;
}
 
int main() {
  int n, s;
  while(cin >> n >> s && (n|s)) {
    cout << rec(n,0,s) << endl;
  }
  return 0;
}

C++: #include<iostream>
using namespace std;
int ans;
bool def(int i,int j,int s){
	if(j==0){
		if(s==0){
			ans++;
		}else return false;
	}
	if(i>9)return false;
	if(s<=0)return false;
	def(i+1,j,s);
	def(i+1,j-1,s-i);
	return false;
}
main(){
	int s,n;
	while(cin>>n>>s,n||s){
		ans=0;
		if(n!=1 && s!=0){
			def(0,n,s);
		}else ans=1;
		cout<<ans<<endl;
	}
}

C++: #include <iostream>
using namespace std;
int n,s,count=0,digits[10];
void dfs(int cur,int start)
{
    if(cur==n){
    int sum=0;
    for(int i=0;i<n;i++){   sum+=digits[i]; }
    if(sum==s){ count++;    }
    return;
    }
    for(int i=start;i<10;i++){
        digits[cur]=i;//重複を避ける
        dfs(cur+1,i+1);
    }
}
  int main(){ 
    cin>>n>>s;
    dfs(0,0);
    cout<<count<<endl;
     return 0;
}

C++: //AOJ Problem0030

#include<iostream>
#include<vector>

using namespace std;

int ans;

void solve(int n,int s,int m,int sum,int max){//n:何個か s:目的値 m:何回目か sum:現在の合計 max:最大の足した数
	
	if(m>n || sum>s){
		return;
	}

	else if(n==m && sum==s){
		ans++;
		return;
	}

	else{
		for(int i=max+1;i<=9;i++){
		
			solve(n,s,m+1,sum+i,i);
		}
	}
}

int main(){

	int n,s;

	vector<int> dataN;
	vector<int> dataS;

	for(;;){
		cin>>n;
		cin>>s;
		if(n==0&&s==0){
			break;
		}
		dataN.push_back(n);
		dataS.push_back(s);
	}
	for(int j=0;j<dataN.size();j++){

		ans=0;

		for(int i=0;i<=9;i++){
			solve(dataN[j],dataS[j],1,i,i);
		}

		cout<<ans<<endl;
	}

	return 0;
}

C++: #include<iostream>
#include<string>
using namespace std;
int main(){
 int n,s;
 while(true){
 cin>>n>>s;
 if(n==0&&s==0)
 break;
 int count=0;
 for(int i=0;i<1024;i++){
  int bit=i;
  int ncount=0,scount=0;
  for(int j=0;j<10;j++){
      if(bit>>j&1==1){
       ncount++;
       scount+=j;
      }
  }
  if(ncount==n&&scount==s)
  count++;
 }
 cout<<count<<endl;
 }
 return 0;   
}

C++: #include <iostream>
using namespace std;
int _s,a,b;
bool solve(int c,int n,int s){
      if(!n) return s==_s;
      if(c>=10) return false;
      return solve(c+1,n-1,s+c) || solve(c+1,n,s);
}
int main(){
      for(;;){
      cin >> a >> _s;
      if(!a)break;
      cout <<((solve(0,a,0))?"YES":"NO")<< endl;
      }
}

C++: #include <iostream>

using namespace std;
//int dp[10][45][10];

int dpc(int n,int s,int num)
{
  //  if(dp[n][s][num]!=-1)
  //  return dp[n][s][num];
  if(n==0)
    return 0;
  if(s==num && n==1)
    return 1;
  if(num==9)
    return 0;
  int sum=0;
  if(n-1>=0 && s-num>=0)
    sum+=dpc(n-1,s-num,num+1);
  sum+=dpc(n,s,num+1);
  //  dp[n][s][num]=sum;
  //  cout<<"sum="<<sum<<endl;
  return sum;
}

int main()
{
  int n,s;
  for(;cin>>n>>s,n;)
    {
      /*
      for(int i=0;i<10;i++)
	for(int j=0;j<45;j++)
	  for(int x=0;x<10;x++)
	  dp[i][j][x]=-1;*/
      cout<<dpc(n,s,0)<<endl;
    }
}

C++: #include<iostream>
using namespace std;
int ans;
bool def(int i,int j,int s){
	if(j==0){
		if(s==0){
			ans++;
		}else return false;
	}
	if(i>9)return false;
	if(s<=0)return false;
	
	def(i+1,j,s);
	def(i+1,j-1,s-i);
	return false;
}
main(){
	int s,n;
	while(cin>>n>>s,n||s){
		ans=0;
		def(0,n,s);
		cout<<ans<<endl;
	}
}

C++: #include <iostream>

int search(int i, int left, int count){
	if(i == 10){
		return left == 0 && count == 0;
	}
	return search(i + 1, left, count) + search(i + 1, left - i, count - 1);
}

int main(){
	int n, s;

	scanf("%d%d", &n, &s);

	std::cout << search(0, s, n) << std::endl;
}

C++: #include <bits/stdc++.h>

using namespace std;

int n, s;

int solve(int cnt, int num, int sum) {

    if(cnt == n) {
        if(sum == s) return 1;
        else return 0;
    }

    int ret = 0;
    for(int i = num + 1; i <= 9; ++i) {
        ret += solve(cnt + 1, i, sum + i);
    }
    return ret;

}

int main() {

    while(cin >> n >> s, n || s) {
        cout << solve(0, -1, 0) << endl;
    }

}