#include
#include
#include
#include <string.h>
#define INF 0x3f3f3f;
using namespace std;
int n = 1,k;
int dp1[60][60][60];
int dp2[60][60];
int dp3[60][60];
struct node{
int a,b,c;
};
node ans[3600];
node ans2[3600];
int main() {
int y = 0;
while(n!=0&&cin>>n>>k){
int i,j,d;
memset(dp1,0,sizeof(dp1));
//生成第一个答案
//边界情况
for(i=0;i<=n;i++){
for(d=0;d<=k;d++){
if(i0&&d0){
dp1[i][0][d] = 1;
}else{
dp1[i][0][d] = 0;
}
}
}
//开始生成dp1
for(j=1;j<=n;j++){
for(i=0;i<=n;i++){
for(d=0;d<=k;d++){
int l;
for(l=0;l<=d&&lj<=i;l++){
dp1[i][j][d]+=dp1[i-lj][j-1][d-l];
}
}
}
}
//生成第二个答案
//边界情况
dp2[0][0] = 1;
for(i=1;i<=n;i++){
dp2[i][0] = 0;
}
//开始生成dp2
for(j=1;j<=n;j++){
for(i=0;i<=n;i++){
dp2[i][j] = dp2[i][j-1]+dp2[i-j][j-1];
}
}
//生成第三个答案
//生成边界条件
dp3[0][0] = 1;
for(i=1;i<=n;i++){
dp3[i][0] = 0;
}
for(j=1;j<=n;j++){
dp3[0][j] = 1;
}
//开始生成dp3
for(j=1;j<=n;j++){
for(i=1;i<=n;i++){
if(j%2==0){
dp3[i][j] = dp3[i][j-1];
}else{
int m;
for(m=0;m*j<=i;m++){
if(m==0){
dp3[i][j] = dp3[i-m*j][j-1];
}else{
dp3[i][j]+=dp3[i-m*j][j-1];
}
}
}
}
}
// for(j=0;j<=n;j++){
// for(i=0;i<=n;i++){
// cout<<dp3[i][j]<<" ";
// }
// cout<<endl;
// }
// cout<<dp1[n][n][k]<<endl;
// cout<<dp2[n][n]<<endl;
// cout<<dp3[n][n]<<endl;
ans[y].a = dp1[n][n][k];
ans[y].b = dp2[n][n];
ans[y].c = dp3[n][n];
y++;
// for(j=0;j<=n;j++){
// for(i=0;i<=n;i++){
// for(d=0;d<=k;d++){
// cout<<dp1[i][j][d]<<" ";
// }
// cout<<endl;
// }
// cout<<endl;
// cout<<endl;
// }
}
int b;
for(b=0;b<y-1;b++){
cin>>ans2[b].a>>ans2[b].b>>ans2[b].c;
}
for(b=0;b<y;b++){
cout<<ans[b].a<<" "<<ans[b].b<<" "<<ans[b].c<<endl;
cout<<ans2[b].a<<" "<<ans2[b].b<<" "<<ans2[b].c<<endl;
}
return 0;
}