做这道题之前可以先做:hdu 1267(递推方法和这道题是一样的知识没有精度计算)这是我的博客链接接:http://www.cnblogs.com/jiangjing/archive/2013/01/18/2866168.html
题意:就是去买票,票价是50元一张,卖票的没有零钱找的,然后买票的只有50元和100元的,题意给出m个人拿了50元n个人拿了100元问总共有多少种买票顺序(不同的人也算)
在hdu 1267里我已经讲了递推方法,我在这里就不纠结了,只要乘以m!n!就可以了
代码实现:
#include<stdio.h> #include<string.h> int a[101][101][101]={0}; int b[101][101]={0}; //b数组里面保存的是a数组里面的元素个数 void qiuhe(int x0,int y0,int x1,int y1,int n)//大数相加这种方法可以先学习下,否则看起来比较吃力 { int i,j,k=0; j=b[x0][y0]; if(j<b[x1][y1]) j=b[x1][y1]; for(i=0;i<j;i++) { a[x0][y0][i]+=a[x1][y1][i]*n+k; k=a[x0][y0][i]/10000;//每个元素四位 a[x0][y0][i]%=10000; } if(k) { a[x0][y0][j]=k; b[x0][y0]=j+1; } else b[x0][y0]=j; } void jiecheng(int n)//求大数阶乘 { int i,j,k=0; for(i=0;i<b[n-1][0];i++) { a[n][0][i]=1; a[n][0][i]=a[n-1][0][i]*n+k; k=a[n][0][i]/10000; a[n][0][i]=a[n][0][i]%10000; } if(k) { a[n][0][i]=k; b[n][0]=i+1; } else b[n][0]=b[n-1][0]; } int main() { int T=0,i,j,m,n; a[1][0][0]=1;b[1][0]=1; for(i=2;i<=100;i++) jiecheng(i);//当m=0时的排列数 for(i=1;i<=100;i++) for(j=i;j<=100;j++) { qiuhe(j,i,j-1,i,j); qiuhe(j,i,j,i-1,i); } while(scanf("%d%d",&m,&n)!=EOF&&(m||n)) { T++; printf("Test #%d:\n",T); printf("%d",a[m][n][b[m][n]-1]); for(i=b[m][n]-2;i>=0;i--) printf("%4.4d",a[m][n][i]); printf("\n"); } return 0; }