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<bits/stdc++.h>
using namespace std;
int dp[11][101];
int serch(int i,int j,int n,int co)
{
    if(dp[i][j]>-1)return dp[i][j];
    else if(i==10)return 0;
    else if(co==n&&j==0)return 1;
    else if(j<0||co==n)return 0;
    return serch(i+1,j,n,co)+serch(i+1,j-i,n,co+1);
}
int main()
{
    int n,s,num;
    memset(dp,-1,sizeof(dp));
    while(cin>>n>>s&&n!=0){
        num=serch(0,s,n,0);
        cout<<num<<endl;
    }
}

C++: #include <bits/stdc++.h>
using namespace std;

int x,y,z[51]={};

int mySet(int d,int e){
	int a=0;
	for(int i=1;i<d;i++){
		if(z[i]>=z[i+1]){
			return 0;
		}
	}
	if(d==x){
		if(e==y){
			return 1;
		}else{
			return 0;
		}
	}
	for(int j=0;j<=9;j++){
		z[d+1]=j;
		a+=mySet(d+1,e+j);
	}
	return a;
}

int main(void){
	while(1){
		cin>>x>>y;
		if(x==0&&y==0){
			break;
		}else{
			cout<<mySet(0,0)<<endl;
		}
	}
	return 0;
}

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

int solve(int n, int s, int p){

  if(!n && !s) return 1;
  if(!n || s < 0) return 0;

  int ans = 0;
  for(int i=p;i<10;i++) ans += solve(n-1,s-i,i+1);

  return ans;
}

int main(){

  int n, s;
  while(true){
    cin >> n >> s;
    if(!n && !s) break;

    cout << solve(n, s, 0) << endl;
  }

}

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

int n, s, ans;

void dfs(int num, int sum, int count){
    if (sum == s && count == 0){
        ans++;
        return;
    }

    if (count == 0 || num == 10) return;

    dfs(num+1, sum+num, count-1);
    dfs(num+1, sum, count);
}

int main(int argc, char const *argv[]){
    while (cin>>n>>s, n||s){
        ans = 0;
        dfs(0, 0, n);
        cout<<ans<<endl;
    }
    
    return 0;
}

C++: #include <iostream>
#include <vector>
#include <map>
#define rep(i) for(int i=0;i<=1;i++)
using namespace std;

vector<int> used(10);
map<vector<int>,int> u;

int n,s,c;
void walk(int now,int dep){
	if(dep==n){
		if(s==now)u[used]=1;
		return;
	}
	for(int i=0;i<=9;i++){
		if(!used[i]){
			used[i]=1;
			walk(now+i,dep+1);
			used[i]=0;
		}
	}
	return;
}
int main(void){
	while(cin>>n>>s,n||s){
		c=0;
		u.clear();
		for(int i=0;i<10;i++)used[i]=0;
		walk(0,0);
		cout<<u.size()<<endl;
	}
	return 0;
}

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

int ret;
int s;

void dfs(int begin, int depth, int sum){
    int i;
    if (depth == 0){
	if (s == sum) ret++;
	return;
    }
    for (i = begin+1; i <= 9; i++){
	dfs(i, depth-1, sum+i);
    }
}

int main(){
    int n;
    int i;
    while (cin >> n >> s, n || s){
	for (i = 0; i <= 9; i++){
	    dfs(i, n-1, i);
	}
	cout << ret << endl;
	ret = 0;
    }
    return 0;
}

C++: #include <stdio.h>

int n, s, cnt;

void dfs(int i, int sum, int n){
    if(sum==s&&!n){
        cnt++;
        return;
    }
    if(i==10||!n) return;
    dfs(i+1,sum,n);
    dfs(i+1,sum+i,n-1);
}

int main(){
	while(1){
		scanf("%d%d",&n,&s);
		if(n==0&&s==0){
			break;
		}
		cnt=0;
		dfs(0,0,n);
		printf("%d\n",cnt);
	}

    return 0;
}

C++: #include <iostream> 

int main(){
	int a,b;	
	while(std::cin>>a>>b&&a!=0&&b!=0){
		int d2=0,d3=0,d4=0,d5=0,d6=0,d7=0,d8=0,d9=0;
		int o=0;
		for(int d=0;d<10;d++){
			if(a>1&&d<=10-a){
				for(d2=d+1;d2<10;d2++){
			if(a>2&&d2<=10-a+1){
				for(d3=d2+1;d3<10;d3++){
			if(a>3&&d3<=10-a+2){
				for(d4=d3+1;d4<10;d4++){
			if(a>4&&d4<=10-a+3){
				for(d5=d4+1;d5<10;d5++){
			if(a>5&&d5<=10-a+4){
			for(d6=d5+1;d6<10;d6++){
			if(a>6&&d6<=10-a+5){
				for(d7=d6+1;d7<10;d7++){
			if(a>7&&d7<=10-a+6){
				for(d8=d7+1;d8<10;d8++){
			if(a>8&&d8<=10-a+7){
				for(d9=d8+1;d9<10;d9++){
		if(a==9&&b==d+d2+d3+d4+d5+d6+d7+d8+d9){
			o++;
		}
			}
		}
		if(a==8&&b==d+d2+d3+d4+d5+d6+d7+d8+d9){
			o++;
		}
			}
		}
		if(a==7&&b==d+d2+d3+d4+d5+d6+d7+d8+d9){
			o++;
		}
			}
		}
		if(a==6&&b==d+d2+d3+d4+d5+d6+d7+d8+d9){
			o++;
		}
			}
		}
		if(a==5&&b==d+d2+d3+d4+d5+d6+d7+d8+d9){
			o++;
		}
			}
		}
		if(a==4&&b==d+d2+d3+d4+d5+d6+d7+d8+d9){
			o++;
		}
			}
		}if(a==3&&b==d+d2+d3+d4+d5+d6+d7+d8+d9){
			o++;
		}
			}
		}if(a==2&&b==d+d2+d3+d4+d5+d6+d7+d8+d9){
			o++;
		}
		}
		if(a==1&&b==d+d2+d3+d4+d5+d6+d7+d8+d9){
			o++;
		}
			}
		}
		std::cout<<o<<std::endl;
	}
	return 0;
}

C++: #include<stdio.h>
void dd(int,int,int);
int n,s,count=0;
int main(void)
{
	while(1){
		scanf("%d %d",&n,&s);
		if(n == 0 && s == 0) break;
		dd(0,0,0);
		printf("%d\n",count);
		count = 0;
	}
	return 0;
}

void dd(int a,int sum,int cnt)
{
	if(sum == s && cnt == n){
		count++;
		//printf("-------\n");
	}
	if(a <10 && sum < s && cnt < n){
		//printf("%d %d %d\n",a,sum,cnt);
		dd(a+1,sum+a,cnt+1);
		dd(a+1,sum,cnt);
	}
}

C++: #include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
#include<utility>

using namespace std;

int n, s;

int cal(int a, int b, int c)
{
	int hoge = 0;

	if (a == 1 && b >= c && b < 10)
	{
		return 1;
	}
	if (a == 1)
	{
		return 0;
	}



	for (int i = c; i < 10 && i < b; i++)
	{
		hoge += cal(a - 1, b - i, i + 1);
	}

	return hoge;


}

int main(void)
{
	while (cin >> n >> s,1)
	{
		if (n==0&&s==0)
		{
			break;
		}

		cout << cal(n, s, 0) << endl;
	}

	return 0;
}

C++: #include<iostream>
int n,s;
int count=0;

int method(int i,int j,int k){
  if(n==i){
    if(j==s){
      count++;
    }
    return 0;
  }
  if(k>9){
    return 0;
  }
  method(i+1,j+k,k+1);
  method(i,j,k+1);
  return 0;
}

int main(){

  while(std::cin >> n >> s){
    if(n==0&&s==0){
      break;
    }
    count =0;
    method(0,0,0);

    std::cout << count << std::endl;
  }
}

C++: #include <iostream>
#include <stack>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cmath>

#define rep(x,to) for(int x=0;x<to;x++)
#define rep2(x,from,to) for(x=from;x<to;x++)

using namespace std;

struct stk{
	int b,n,s;
	stk(int b, int n, int s) : b(b), n(n), s(s) {}
};

int chkl(int nn, int ss){
int i, cnt=0;
stack< stk > que;
	que.push(stk(-1,0,0));
	while(!que.empty()){
		stk cr = que.top();
		que.pop();
		rep2(i,cr.b+1,10){
			stk nt = cr;
			nt.b=i; nt.n++; nt.s +=i;
//			printf("r= %d %d %d\n",nt.b,nt.n,nt.s);
			if(nt.n==nn && nt.s == ss){
				cnt++;  continue;
			}
			if(nt.s > ss) break;
			if(nt.n > nn) break;
			if(nt.n < nn && nt.s < ss) que.push(nt);

		}
	}
	return cnt;
}

int main(void){

int nn, ss;
	
	while(cin >> nn >> ss){
		if(nn ==0 && ss ==0) break;
		cout << chkl(nn,ss) << endl;
		
	}
	return 0;
}

C++: #include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int n, s;
int dp[10][100][10];
int solve(int i, int j, int k);

int main(void){
	
	while(cin >> n >> s, n){
		fill_n(**dp,10*100*10,-1);
		cout << solve(0,0,10) << endl;
	}
}

int solve(int now, int sum, int b1){
	if(now == n){
		if(sum == s){return 1;}
		else return 0;
	}
	if(dp[now][sum][b1] != -1){return dp[now][sum][b1];}
	now++;
	int t = 0;
	for(int i = 0; i < 10; i++){
		if(b1 != 10 && b1 >= i){continue;}
		t += solve(now, sum + i, i);
	}
	return dp[now][sum][b1] = t;
}

C++: #include <iostream>
using namespace std;
int ret[10][110];
int main(){
	ret[0][0]=1;
	for(int i=9;i>=0;i--){//add
		for(int j=8;j>=0;j--){//used
			for(int k=0;k<100;k++){
				if(i+k<=100)	ret[j+1][i+k]+=ret[j][k];
			}
		}
	}
	int n,s;
	while(true){
		cin>>n>>s;
		if(n==0)	return 0;
		cout<<ret[n][s]<<endl;
	}
	return 0;
}