公式:(m+n)!*(m-n+1)/(m+1)
简单的大数运算。看似有除法,可以约去,大数相乘就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std ;
int len;
int M[305];
void Mult(int *a,int k)
{
int Curlen=0,tmp;
int carry=0;
for(int i=0;i<len;i++){
tmp=a[i]*k+carry;
a[Curlen++]=tmp%10000; //先前进制少了,存不下。
carry=tmp/10000;
}
if(carry) a[Curlen++]=carry;
len=Curlen;
}
int main()
{
int n,m,T=1;
while(scanf("%d %d",&m,&n),(n||m)){
if(n>m){
printf("Test #%d:\n0\n",T++);
continue;
}
memset(M,0,sizeof(M));
M[0]=1,len=1;
for(int i=m+n;i>1;i--){
if(i==m+1) continue;
Mult(M,i);
}
if(n) Mult(M,m-n+1);
printf("Test #%d:\n",T++);
printf("%d",M[len-1]);
for(int i=len-2;i>=0;i--) printf("%04d",M[i]);
puts("");
}
return 0 ;
}