zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    获取平台所有接口的IP和MAC地址
    共享内存
    消息队列
    shell常见语法
    保存结构体到文件
    Bookmarks
    js打开新窗口
    要买的书
    批量下载辅助工具
    解决word没有菜单栏和工具栏
  • 原文地址:https://www.cnblogs.com/Gaxc/p/10201769.html
Copyright © 2011-2022 走看看