这个是大黄dp分类里边的..这是非dp做法..找出一个公式. (m+n)!*(m-n+1)/(m+1) 刚开始没有处理不能排队的情况..wa了几次..用dev写的代码..忘记去掉system了..re了两次 明天试试用dp写一个.. #include <stdio.h> #include <string.h> #define MAXN 10000 #include <stdlib.h> int num[MAXN]={0}; int main(void) { // freopen("in.txt","r",stdin); // freopen("out_my.txt","w",stdout); int n;int m; int total=0; while(scanf("%d %d",&m,&n)!=EOF) { if(n==0&&m==0) break; printf("Test #%d:/n",++total); if(n>m) { printf("0/n"); continue; } int nn=n+m; int count=0; num[0]=1; count=1; for(int ii=2;ii<=n+m;ii++) { int i= ii; if(i==m+1) i=m-n+1; for(int j=0;j<count;j++) { num[j]*=i; } for(int j=0;j<count;j++) { if(num[j]>9) { int tmp = num[j]/10; num[j]%=10; num[j+1]+=tmp; } while(num[count]!=0) { int tmp = num[count]/10; num[count]%=10; num[count+1]+=tmp; count++; } } } for(int i=count-1;i>=0;i--) { printf("%d",num[i]); num[i] = 0; } printf("/n"); } return 0; }