球迷购票问题

题目描述

球赛门票的售票处规定每位购票者限购一张门票,且每张门票售价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     }
原文地址:https://www.cnblogs.com/noip/p/2656909.html