题意:有n+m个人要买票,其中n个人拿着10元的钞票,m个人拿着20元的钞票,现在手中有k张10元钞票,每张门票价值10元,问所有人能买到门票的概率。
思路:如果n=m且k为0,那么这道题就退化成了卡特兰数的问题。
现在考虑将所有情况画在一张图上,每个点的x坐标为当前进场人数,y坐标为10元钞票比20元钞票多的数量,所以起点为(0,k),终点为(n+m,n+k-m),总的方案数为C(n+m, n)*n!*m!。
然后考虑不合法的方案数,如果方案不合法,那么折线一定和y=-1有交点,现在考虑折线上最后一个与y=-1的交点,假设这个点为A点,那么从A点以后折线大于等于零的,现在将A点以后的折线以y=-1为对称轴翻折下来,那么终点变为了(n+m,-2+m-n-k),可以发现所有不合法的方案经过翻折都会到达这个终点,所以不合法方案数就是从起点到达新终点的方案数。
#include <bits/stdc++.h>
#define eps 1e-6
#define LL long long
#define pii pair<int, int>
#define pb push_back
#define mp make_pair
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
//const int MAXN = 5000000 + 5;
//const int MOD = 1e9+7;
//const int INF = 0x3f3f3f3f;
int n, m, k;
int main()
{
freopen("input.txt", "r", stdin);
cin >> n >> m >> k;
if (n+k-m < 0) {
puts("0");
return 0;
}
double ans = 1.0;
for (int i = 0; i <= k; i++)
ans = ans*(m-i)/(n+i+1);
ans = 1.0 - ans;
printf("%.6f", ans);
return 0;
}