知识点
组合数学、快速幂、逆元
思路
//C
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
const int INF = 0x3f3f3f3f;
const ll p = 1e9 + 7;
ll jc[maxn];
ll pre_jc()
{
jc[0] = 1;
for(int i = 1; i <= maxn; i++)
jc[i] = jc[i - 1] * i % p;
return 0;
}
ll quick_mul(ll a, ll b)
{
ll ans = 1;
while(b)
{
if(b & 1)
ans = ans * a % p;
a = a * a % p;
b >>= 1;
}
return ans;
}
ll C(ll n, ll m)
{
if(m < 0 || m > n)
return 0;
ll ans = 1;
ans = ans * jc[n] % p * quick_mul(jc[m] * jc[n - m] % p, p - 2) % p;
return ans;
}
ll lucas(ll a, ll b)
{
if(b == 0)
return 1;
return C(a % p, b % p) % p * lucas(a / p, b / p) % p;
}
int main()
{
pre_jc();
int f, w, h;
cin >> f >> w >> h;
if(w == 0)
printf("1\n");
else
{
ll q = 0;
ll son = 0;
for(ll i = 1; i <= w; i++)
{
q = (q + C(w - 1, i - 1) * C(f + 1, i) % p) % p;
}
q = quick_mul(q, p - 2);
for(ll i = 1; i <= w / (h + 1); i++)
{
son = (son + C(w - i * h - 1, i - 1) * C(f + 1, i) % p) % p;
}
printf("%lld\n", q * son % p);
}
return 0;
}
参考来源
https://blog.csdn.net/v5zsq/article/details/79055449