bzoj3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合)
Posted gaxc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合)相关的知识,希望对你有一定的参考价值。
题目描述:约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有K(O≤K<N)只牝牛.请计算一共有多少种排队的方法.所有牡牛可以看成是相同的,所有牝牛也一样.答案对5000011取模。
输入格式:一行,输入两个整数N和K.
输出格式:一个整数,表示排队的方法数.
输入样例:
4 2
输出样例:
6
解析:一道比较简单的题,直接组合数算一下即可。
代码如下:
#include<cstdio>
using namespace std;
const int MOD = 5000011;
int n, k, fac[100005], ans;
int ksm(int x, int y) {
int res = 1, base = x;
while (y > 0) {
if (y & 1) res = 1ll * res * base % MOD;
base = 1ll * base * base % MOD;
y >>= 1;
}
return res;
}
int C(int a, int b) {
int inv = 1ll * ksm(fac[b], MOD - 2) * ksm(fac[a - b], MOD - 2) % MOD;
return 1ll * fac[a] * inv % MOD;
}
int main() {
scanf("%d %d", &n, &k);
fac[0 ] = 1; ans = 1;
for (int i = 1; i <= n; ++ i) fac[i] = 1ll * fac[i - 1] * i % MOD;
for (int i = 1; i <= n; ++ i) {
int tmp = n - (i - 1) * k;
if (i > tmp) break;
ans += C(tmp, i);
ans %= MOD;
}
printf("%d", ans);
return 0;
}
以上是关于bzoj3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合)的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛:dp前缀和优化
bzoj3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合)
bzoj1579 [Usaco2009 Feb]Revamping Trails 道路升级
bzoj1579: [Usaco2009 Feb]Revamping Trails 道路升级
Bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 dijkstra,堆,分层图