球迷购票问题
题目描述
球赛门票的售票处规定每位购票者限购一张门票,且每张门票售价50元。购票者中有m位手持50元钱币,另有n人手持100元。假设售票处开始售票时无零钱。问这m+n人有几种排队方式可使售票处不致出现找不出钱的局面。
对给定的m,n(0<=m,n<=5000),计算出排队方式总数。
输入格式
两个整数m和n。
输出格式
输出方案数.
递推了好长时间,不得不看题解,然后向蔡佳文借了一本数学《奥赛经典》,学到一个公式。还用到了高精度除法。
C(m+n,n)-C(m+n,n-1);
1 #include<iostream> 2 using namespace std; 3 4 int m,n,a[9001]; 5 6 void Mul(int x){ 7 for(int i=0;i<9000;++i) 8 a[i]*=x; 9 10 for(int i=0;i<9000;++i) 11 if(a[i]>10) 12 { 13 a[i+1]+=a[i]/10; 14 a[i]%=10; 15 } 16 } 17 18 void Div(int x){ 19 int now=0; 20 for(int i=9000;i>=0;--i) 21 { 22 now=10*now+a[i]; 23 a[i]=now/x; 24 now%=x; 25 } 26 } 27 28 int main() 29 { 30 cin>>m>>n; 31 32 if(n>m) {cout<<0<<endl;return 0;} 33 34 a[0]=1; 35 36 swap(n,m); 37 for(int i=1;i<=m;++i) 38 { 39 Mul(m+n-i+1); 40 Div(i); 41 } 42 43 Mul(n-m+1); 44 Div(n+1); 45 46 int i=9000; 47 while(a[i]==0) i--; 48 while(i>=0) cout<<a[i--]; 49 50 cout<<endl; 51 // system("pause"); 52 return 0; 53 54 }