'commit'
This commit is contained in:
38
TangDou/AcWing_TiGao/T5/ZhuHeJiShu/1307_GeBanFa.cpp
Normal file
38
TangDou/AcWing_TiGao/T5/ZhuHeJiShu/1307_GeBanFa.cpp
Normal file
@@ -0,0 +1,38 @@
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
#define int long long
|
||||
#define endl "\n"
|
||||
const int MOD = 5000011; // 质数,可以使用费马小定理求逆元
|
||||
const int N = 1e5 + 10;
|
||||
int fact[N]; // 阶乘数组
|
||||
// 快速幂
|
||||
int qmi(int a, int b, int p) {
|
||||
int res = 1;
|
||||
a %= p;
|
||||
while (b) {
|
||||
if (b & 1) res = res * a % p;
|
||||
b >>= 1;
|
||||
a = a * a % p;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
// 利用组合数定义式求C(m,n),用到快速幂求逆元
|
||||
int C(int m, int n) {
|
||||
if (m < n) return 0;
|
||||
return fact[m] * qmi(fact[n], MOD - 2, MOD) % MOD * qmi(fact[m - n], MOD - 2, MOD) % MOD;
|
||||
}
|
||||
|
||||
int n, k; // n只牛,两只牡牛之间,最少需要k只牝牛
|
||||
signed main() {
|
||||
// 预处理范围内数字的阶乘
|
||||
fact[0] = 1;
|
||||
for (int i = 1; i < N; i++) fact[i] = (fact[i - 1] * i) % MOD;
|
||||
|
||||
cin >> n >> k;
|
||||
int res = 0;
|
||||
for (int i = 1; i <= (n + k) / (k + 1); i++) // 枚举牡牛的所有可能数量
|
||||
res = (res + C(n - (i - 1) * k, i)) % MOD; // 累计组合数
|
||||
|
||||
// 如果0只牡牛,还应该增加一种方案,就是全都是牝牛
|
||||
cout << res + 1 << endl;
|
||||
}
|
||||
Reference in New Issue
Block a user