#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int N=400;
char store[203][N];
//将整数n转化为字符串s;
void itos(int n,char *s)
{
int i,j,t[5];
if(n==0)
{
s[0]='0';s[1]='0';
}
//n不为0
i=0;
while(n)
{
t[i++]=n%10;
n/=10;
}
i-=1;
j=0;
while(i>=0)
s[j++]=t[i--]+'0';
s[j]=0;
}
//计算m*c=res。默认m和c均不为0
void mul(char *m,char *c,char *res)
{
int i,j,len1,len2;
len1=strlen(m);
len2=strlen(c);
int *r=new int[len1+len2+1]; //乘积长度
for(i=0;i<=len1+len2;++i) //初始化为0
r[i]=0;
for(i=0;i<=len1;++i) //计算乘积
for(j=0;j<len2;++j)
r[i+j+1]+=(m[i]-'0')*(c[j]-'0');
for(i=len1+len2-1;i>=1;--i) //处理单位
{
if(r[i]>9)
{
int tmp=r[i]/10;
r[i]%=10;
r[i-1]+=tmp;
}
}
//处理前导0
for(i=0;i<len1+len2&&!r[i];++i)
//乘积我0
if(i==len1+len2)
{
res[0]='0';
res[1]=0;
return ;
}
j=0;
while(i<len1+len2)
{
res[j++]=r[i++]+'0';
}
res[j]=0;
delete []r;
}
//计算阶乘
void factorial(int n,char *res)
{
char s[N],t[N];
if(n==0)
{
res[0]='1';res[1]=0;
}
//n*(n-10)*(n-2)*···3*2*1
itos(n,res);
while(--n>1)
{
itos(n,s);
mul(res,s,t);
strcpy(res,t);
}
}
//小数d去除大数m
void div(char *m,int d,char *res)
{
int i,len;
int r;
len=strlen(m);
r=0; //余数
for(i=0;i<len;++i)
{
r=r*10+m[i]-'0';
res[i]=r/d+'0'; //商
r%=d;
}
res[len]=0;
//忽略前导0
i=0;
while(res[i]=='0')
++i;
if(i!=0)
strcpy(res,res+i);
}
int main()
{
int m,n,i;
char r[N],s[N],t[N];
//预处理,计算出前200个数的阶乘值,存放在store[N]
for(i=1;i<=200;++i)
factorial(i,store[i]);
while(scanf("%d%d",&m,&n)!=EOF)
{
if(!m&&!n) break;
if(m<n)
{
printf("%d\n",0);
continue;
}
i=0;
while((s[i]=store[m+n][i])!=0)
++i;
itos(m+1-n,t);
mul(s,t,r);
div(r,m+1,t);
printf("%s\n",t);
}
return 0;
}
#include<stdio.h>
#include<string.h>
using namespace std;
const int N=400;
char store[203][N];
//将整数n转化为字符串s;
void itos(int n,char *s)
{
int i,j,t[5];
if(n==0)
{
s[0]='0';s[1]='0';
}
//n不为0
i=0;
while(n)
{
t[i++]=n%10;
n/=10;
}
i-=1;
j=0;
while(i>=0)
s[j++]=t[i--]+'0';
s[j]=0;
}
//计算m*c=res。默认m和c均不为0
void mul(char *m,char *c,char *res)
{
int i,j,len1,len2;
len1=strlen(m);
len2=strlen(c);
int *r=new int[len1+len2+1]; //乘积长度
for(i=0;i<=len1+len2;++i) //初始化为0
r[i]=0;
for(i=0;i<=len1;++i) //计算乘积
for(j=0;j<len2;++j)
r[i+j+1]+=(m[i]-'0')*(c[j]-'0');
for(i=len1+len2-1;i>=1;--i) //处理单位
{
if(r[i]>9)
{
int tmp=r[i]/10;
r[i]%=10;
r[i-1]+=tmp;
}
}
//处理前导0
for(i=0;i<len1+len2&&!r[i];++i)
//乘积我0
if(i==len1+len2)
{
res[0]='0';
res[1]=0;
return ;
}
j=0;
while(i<len1+len2)
{
res[j++]=r[i++]+'0';
}
res[j]=0;
delete []r;
}
//计算阶乘
void factorial(int n,char *res)
{
char s[N],t[N];
if(n==0)
{
res[0]='1';res[1]=0;
}
//n*(n-10)*(n-2)*···3*2*1
itos(n,res);
while(--n>1)
{
itos(n,s);
mul(res,s,t);
strcpy(res,t);
}
}
//小数d去除大数m
void div(char *m,int d,char *res)
{
int i,len;
int r;
len=strlen(m);
r=0; //余数
for(i=0;i<len;++i)
{
r=r*10+m[i]-'0';
res[i]=r/d+'0'; //商
r%=d;
}
res[len]=0;
//忽略前导0
i=0;
while(res[i]=='0')
++i;
if(i!=0)
strcpy(res,res+i);
}
int main()
{
int m,n,i;
char r[N],s[N],t[N];
//预处理,计算出前200个数的阶乘值,存放在store[N]
for(i=1;i<=200;++i)
factorial(i,store[i]);
while(scanf("%d%d",&m,&n)!=EOF)
{
if(!m&&!n) break;
if(m<n)
{
printf("%d\n",0);
continue;
}
i=0;
while((s[i]=store[m+n][i])!=0)
++i;
itos(m+1-n,t);
mul(s,t,r);
div(r,m+1,t);
printf("%s\n",t);
}
return 0;
}