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

Submitted solutions:

code_snippet: #include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
int n, s;
bool used[10];
lli dfs(bool used[10], int now, int sum) {
  if (sum > s)
    return 0;
  if (now == n) {
    if (sum == s)
      return 1;
    return 0;
  }
  int res = 0;
  for (int i = 0; i < 10; ++i) {
    if (used[i])
      continue;
    used[i] = true;
    res += dfs(used, now + 1, sum + i);
    used[i] = false;
  }
  return res;
}
lli fact(int n) {
  if (n <= 1)
    return 1;
  return n * fact(n - 1);
}
int main() {
  int f[10];
  for (int i = 1; i < 10; ++i)
    f[i] = fact(i);
  while (cin >> n >> s, n || s) {
    memset(used, false, sizeof(used));
    cout << dfs(used, 0, 0) / f[n] << endl;
  }
}
accuracy: 1
time_ms: 100
memory_kb: 3096
final_rank: 3

code_snippet: #include <iostream>
using namespace std;
int n, s, spn;
void sp(int ne, int ns, bool *flag) {
  if (ne > n)
    return;
  if (ne == n && ns == s)
    spn++;
  for (int i = 0; i < 10; ++i) {
    if (!flag[i]) {
      flag[i] = true;
      sp(ne + 1, ns + i, flag);
      flag[i] = false;
    }
  }
}
int perm(int n) { return (n ? n * perm(n - 1) : 1); }
int main() {
  while (1) {
    cin >> n >> s;
    if (!n)
      return 0;
    spn = 0;
    bool flag[10] = {false};
    sp(0, 0, flag);
    spn /= perm(n);
    cout << spn << endl;
  }
  return 0;
}
accuracy: 1
time_ms: 270
memory_kb: 3084
final_rank: 4

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

int xx(int a,int b,int c,int d){
  if(c == 1){
    if(d - b > a && d - b <= 9) return 1;
    else return 0;
  }
  else{
    if(d - b <= a) return 0;
    else{
      int sum=0;
      for(int i = a+1;i <= d-b;i++){
        sum += xx(i,b+i,c-1,d);
      }
      return sum;
    }
  } 
}

int main(){
  while(true){
    int n,x;
    cin >> n >> x;
    if(n == 0 && x == 0){
      return 0;
    }
    cout << xx(-1,0,n,x) << endl;
  }  
}
accuracy: 1
time_ms: 10
memory_kb: 3080
final_rank: 2

code_snippet: #include <bits/stdc++.h>
#define NIL (-1)
#define LL long long
using namespace std;
const int64_t MOD = 1e9 + 7;
const int INF = INT_MAX;
const double PI = acos(-1.0);

void sub(int n, int s, vector<bool> used, int& cnt) {
	if (!n) {
		if (!s) cnt++;
		return;
	}
	else {
		for (int i = 0; i < 10; i++) {
			if (used[i]) continue;
			used[i] = 1;
			sub(n - 1, s - i, used, cnt);
			used[i] = 0;
		}
	}
	return;
}

int main() {
	int n, s;
	while (cin >> n >> s) {
		if (!n && !s) break;
		int cnt = 0;
		vector<bool> used(10);
		for (int i = 0; i < 10; i++) {
			if (used[i]) continue;
			used[i] = 1;
			sub(n - 1, s - i, used, cnt);
			used[i] = 0;
		}
		int m = 1;
		for (int i = 0; i < n; i++) {
			m *= (n - i);
		}
		//cout << m << endl;
		cout << cnt / m << endl;
	}
}
accuracy: 1
time_ms: 980
memory_kb: 3000
final_rank: 6

code_snippet: #include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<iomanip>
#include <string>
#include <math.h>
using namespace std;
int main(){
    long long int n,s,q=0;
    vector<int>a={0,1,2,3,4,5,6,7,8,9};
    vector<long long int>c(100);
    c[0]=1;
    vector<vector<long long int>> b(1000,vector<long long int>(1000));
    for(int i=0;i<10;i++){
        c[i+1]=c[i]*(i+1);
    }
    do {
        for(int i=0;i<10;i++){
            q+=a[i];
            b[i+1][q]++;
        }
        q=0;
    } while (next_permutation(a.begin(), a.end()));
    cin>>n;
    while(n!=0){
        cin>>s;
        cout<<b[n][s]/(c[10-n]*c[n])<<endl;
        cin>>n;
    }
    
    return 0;
}
accuracy: 1
time_ms: 40
memory_kb: 10592
final_rank: 7

code_snippet: #include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
#include<stdio.h>
#include<queue>
#include <climits>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int mod = 1e9 + 7;
const long long INF = 1LL << 60;

bool notuse[10];
int cnt;

void dfs(int n,int k)
{
    if(n==0 && k == 0){
        cnt++;
        return ;
    }else{
        for(int i = 0; i < 10; i++){
            if(notuse[i] && k - i >= 0){
                notuse[i] = false;
                dfs(n-1,k-i);
                notuse[i] = true;
            }
        }
    }
}

int main() 
{
    ll div[9] = {1};
    for(int i = 1; i < 9; i++){
        div[i]=div[i-1]*(i+1);
    }
    while(true){
        int n,s; cin >> n >> s;
        if(n==0 && s == 0) break;
        for(int i = 0; i < 10; i++){
            notuse[i] = true;
        }
        cnt = 0;
        dfs(n,s);
        cout << cnt/div[n-1] << endl;
    }
}
accuracy: 1
time_ms: 500
memory_kb: 3064
final_rank: 5

code_snippet: #include<iostream>

using namespace std;

int count(int n, int s, int a) {
  if (n == 1) {
    if (0 <= s && s <= 9 && a <= s) {
      return 1;
    } else {
      return 0;
    }
  }
    else {
      int c = 0;
      for (int b = a; s - b > 0; b++) {
      c += count(n - 1, s - b, b + 1);
  }
  return c;
}
}
int main() {
  int n, s;
  while (cin >> n >> s, n || s) {
    cout << count(n, s, 0) << endl;
  }
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3044
final_rank: 1