买票问题,m个拿50,n个拿100,买票处没钱找,这m + n这么排才合法。
公式: (C(m + n, n) - C(m + n, m + 1) ) * m ! * n ! 化简后 : (m + n)! * (m - n + 1)/ (m + 1).
总的情况 不合法情况
#include <iostream>
#include <cstring>
using namespace std;
int num[500];
void count(int m, int n)
{
int i, j, k;
memset(num, 0, sizeof(num));
num[0] = 1;
for(i = 2; i <= m + n; i++)
{
k = 0;
for(j = 0; j < 500; j++)
{
k += num[j] * i;
num[j] = k % 10;
k /= 10;
}
}
k = 0;
for(j = 0; j < 500; j++)
{
k += num[j] * (m - n + 1);
num[j] = k % 10;
k /= 10;
}
for(i = 499; i >= 0; i--)
if(num[i])
break;
int div = 0;
while(i >= 0)
{
div = div * 10 + num[i];
num[i] = div / (m + 1);
div %= (m + 1);
i--;
}
}
int main()
{
int m, n;
int t = 1;
while(cin >> m >> n)
{
if(m == 0 && n == 0)
break;
cout << "Test #" << t++ << ":" << endl;
if(n > m)
cout << 0 << endl;
else
{
count(m, n);
int j;
for(j = 499; j >= 0; j--)
if(num[j])
break;
while(j >= 0)
cout << num[j--];
cout << endl;
}
}
return 0;
}