中心思想是用快速幂求逆元,来求出组合数 WA第20,46两点
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 2100010;
int n, m, p;
int f[N], in_f[N];
int sum;
LL qmi(int a, int k, int p)
{
int res = 1;
while (k)
{
if (k & 1) res = (LL)res * a % p;
k >>= 1;
a = (LL)a * a % p;
}
return res;
}
LL get(int a, int b)
{
return (LL)f[a] * in_f[b] % p * in_f[a - b] % p;
}
signed main()
{
cin >> n >> m >> p;
if (m == 1) // 特判
{
cout << n % p;
return 0;
}
f[0] = in_f[0] = 1;
for (int i = 1; i <= n + m; i ++ )
{
f[i] = (LL)f[i - 1] * i % p;
in_f[i] = qmi(f[i], p - 2, p) % p;
if (i <= m) sum = (sum + f[i]) % p;
}
int ans = 0;
for (int i = 0; i <= n; i ++ )
{
ans = (LL)(ans + (LL)i * get(n - i + m - 2, m - 2) % p) % p;
}
cout << (LL)ans * sum % p << endl;
// cout << get(3, 0);
return 0;
}