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;
}

原文地址:https://www.cnblogs.com/Gaxc/p/10201769.html

时间: 2024-11-10 03:12:00

bzoj3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合)的相关文章

bzoj3398[Usaco2009 Feb]Bullcow 牡牛和牝牛*

bzoj3398[Usaco2009 Feb]Bullcow 牡牛和牝牛 题意: n头牛,其中有牡牛和牝牛两种,要求任意两只牡牛中要有k只牝牛,问几种方案.n≤100000 题解: dp.f[i]表示第i头牛为牡牛的方案数,f[i]=sigma(j,1,i-k-1)f[j],这个可以用前缀和维护,最后答案为sigma(i,1,n)f[i]. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm&g

[BZOJ3398] [Usaco2009 Feb]Bullcow 牡牛和牝牛(动态规划)

3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 235  Solved: 159[Submit][Status][Discuss] Description 约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有K(O≤K<N)只牝牛. 请计算一共有多少种排

BZOJ 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛( dp )

水题...忘了取模就没1A了.... --------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; const int MOD = 5000011; const int maxn = 100009; int dp[maxn], n, k; int main() { cin >> n >> k;

bzoj:3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛

Description 约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有K(O≤K<N)只牝牛. 请计算一共有多少种排队的方法.所有牡牛可以看成是相同的,所有牝牛也一样.答案对5000011取模 Input 一行,输入两个整数N和K. Output 一个整数,表示排队的方法数. Sample Input 4 2 Sample Output 6 初二在纪中集训的时候

【BZOJ】【3398】【USACO 2009 Feb】Bullcow 牡牛和牝牛

组合计数 排列组合求总方案数 这个可以用一个一维的动态规划解决: f[i][0]表示第i头牛是牝牛的方案数 f[i][1]表示第i头牛是牡牛的方案数 则转移为:f[i][0]=f[i-1][0]+f[i-1][1]; f[i][1]=f[i-K-1][0]+f[i-K-1][1]; 常数优化:将取模运算改为if判断语句……可从20ms降为16ms 1 /************************************************************** 2 Problem

Bullcow 牡牛和牝牛(bzoj 3398)

Description 约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有K(O≤K<N)只牝牛. 请计算一共有多少种排队的方法.所有牡牛可以看成是相同的,所有牝牛也一样.答案对5000011取模 Input 一行,输入两个整数N和K. Output 一个整数,表示排队的方法数. Sample Input 4 2 Sample Output 6 样例说明 6种方法分

牡牛和牝牛

牡牛和牝牛 有n个0或者1,进行全排列,要求任意两个0间至少有k个1,询问其方案数%5000011. 对于全部数据,对于全部数据,\(1≤N≤10^5,0≤K<N\). 解: 显然为排列组合问题,考虑方向自然为通项与递推方程. 法一(通项公式): 首先0决定了1的摆放,其次数据范围支持对0的枚举,于是枚举0的个数,设其x,于是每个间隔至少要有k个1,不妨先构造让其满足条件,需要(x-1)k个1,显然有\((x-1)k+x\leq n\Rightarrow [\frac{n+k}{k+1}]\),

【BZOJ 1579】 1579: [Usaco2009 Feb]Revamping Trails 道路升级 (最短路)

1579: [Usaco2009 Feb]Revamping Trails 道路升级 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 <= P1_i <= N; 1 <= P2_i<= N). John需要T_i (1 <= T_i <= 1,000,000)时间单位用道路i从P1_i走到P2_i或者从P2_i 走

Bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 dijkstra,堆,分层图

1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1573  Solved: 428[Submit][Status][Discuss] Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 <= P1_i <= N;