组合计数/乘法逆元

  排列组合求总方案数

  这个可以用一个一维的动态规划解决:

    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

 /**************************************************************
Problem: 3398
User: Tunix
Language: C++
Result: Accepted
Time:16 ms
Memory:1588 kb
****************************************************************/ //BZOJ 3398
#include<cstdio>
#define F(i,j,n) for(int i=j;i<=n;++i)
int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>'') {if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<='') {v=v*+ch-''; ch=getchar();}
return v*=sign;
}
const int N=,P=;
int f[N][],n,K;
int main(){
n=getint(); K=getint();
f[][]=f[][]=;
F(i,,n){
if(i-K->) f[i][]=f[i-K-][]+f[i-K-][];
else f[i][]=;
f[i][]=f[i-][]+f[i-][];
if(f[i][]>=P) f[i][]-=P;
if(f[i][]>=P) f[i][]-=P;
}
printf("%d\n",(f[n][]+f[n][])%P);
return ;
}

2015年2月6日 15:38:06

UPD: 本题也可用排列组合的方式计算

  枚举牝牛的数量a,那么一定至少有(a-1)*k头牡牛,那么除掉这(a-1)*k头牡牛,还剩下b=n-(a-1)*k-a头牡牛。

  这a头牝牛和b头牡牛是随便排的……也就是求一个多重全排列 即 (a+b)! / a!*b!

  这里的除法需用逆元来算

  逆元的计算方法是:已知a、p,求x满足 a*x≡1 (mod p) 那么根据费马小定理(或欧拉定理)可知x= pow(a,p-2)

ps:由于我的方法是O(n)预处理出来所有的阶乘,所以时间复杂度上甚至不如上面那种DP的方法……求大神指导本题0msAC的正确姿势TAT

 /**************************************************************
Problem: 3398
User: Tunix
Language: C++
Result: Accepted
Time:24 ms
Memory:2052 kb
****************************************************************/ //BZOJ 3398
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std;
int getint(){
int v=,sign=; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') sign=-; ch=getchar();}
while(isdigit(ch)) {v=v*+ch-''; ch=getchar();}
return v*sign;
}
/*******************template********************/
typedef long long LL;
const int P=;
LL pow(LL a,LL b,LL P){
LL r=,base=a%P;
while(b){
if (b&) r=r*base%P;
base=base*base%P;
b>>=;
}
return r;
}
LL p[];
int main(){
LL n=getint(),k=getint();
p[]=p[]=;
F(i,,n) p[i]=p[i-]*i%P;
LL ans=+n;// 当a=0 ans=1,a=1,ans=n
F(i,,n){
LL a=i,b=n-(i-)*k-i;
if (b<) break;
ans=(ans+p[a+b]*( pow(p[a]*p[b]%P,P-,P) )%P)%P;
}
printf("%lld\n",ans);
return ;
}

【BZOJ】【3398】【USACO 2009 Feb】Bullcow 牡牛和牝牛的更多相关文章

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

    水题...忘了取模就没1A了.... --------------------------------------------------------------------------- #incl ...

  2. 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛

    3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 243  Solved: 167[S ...

  3. BZOJ3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛

    3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 30  Solved: 17[Sub ...

  4. BZOJ_3398_[Usaco2009 Feb]Bullcow 牡牛和牝牛_组合数学

    BZOJ_3398_[Usaco2009 Feb]Bullcow 牡牛和牝牛_组合数学 Description     约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛, ...

  5. 【BZOJ】3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合+乘法逆元+欧拉定理/费马小定理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3398 以下牡牛为a,牝牛为b. 学完排列计数后试着来写这题,“至少”一词可以给我们提示,我们可以枚举 ...

  6. bzoj 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——前缀和优化dp / 排列组合

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3398 好简单呀.而且是自己想出来的. dp[ i ]表示最后一个牡牛在 i 的方案数. 当前 ...

  7. BZOJ 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛:dp【前缀和优化】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3398 题意: 约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡 ...

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

    Description     约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡 ...

  9. bzoj 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛【dp】

    设f[i]为i为牡牛的方案数,f[0]=1,s为f的前缀和,f[i]=s[max(i-k-1,0)] #include<iostream> #include<cstdio> u ...

  10. BZOJ 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛 水题~

    水~ #include <cstdio> #define N 100004 #define mod 5000011 #define setIO(s) freopen(s".in& ...

随机推荐

  1. js 数组的length(javascript教程四)

    这是一个简单的函数,就是利用length来判断数组再遍历数组了. <script language="javascript" type="text/javascri ...

  2. 桌面虚拟化之XenDesktop7

    安装篇 1. 安装所需要的组件 2. 安装核心组件 配置篇 完整的部署 1. 打开Citrix Studio软件 2. 选择完整部署 3. 创建站点 4. 选择数据库(可以使用自己的或者默认使用自带的 ...

  3. CSS里的引用@import、link

    引入CSS的方法有两种,一种是@import,一种是link @import url('地址');<link href="地址" rel="stylesheet&q ...

  4. DTCMS使用ajax局部刷新

    动力启航的DTCMS代码遇到的问题: 前台post请求: $.ajax({ type: "POST", url: sendUrl, dataType: "json&quo ...

  5. VxWorks 6.9 内核编程指导之读书笔记 -- 多任务

    概述 VxWork系统任务 任务调度 任务创建和管理 任务的错误状态 任务异常处理 共享代码和重入 概述 现代实时操作系统是基于多任务和任务间通信的概念的.多任务环境运行一个实时进程RTP可以被作为一 ...

  6. UI1_ViewController视图切换及Appdelegate

    // // ThirdViewController.h // UI1_ViewController视图切换及Appdelegate // // Created by zhangxueming on 1 ...

  7. 原生js实现addClass,removeClass,hasClass方法

    function hasClass(elem, cls) { cls = cls || ''; if (cls.replace(/\s/g, '').length == 0) return false ...

  8. JQuery Pagination 分页插件 增加了首页尾页以及跳转功能

    JQuery分页插件 挺好用的 但是官方是没有提供首页尾页以及跳转功能 我觉得这个功能可以有,于是就改进了一下 一个js一个css从连接里面下 链接:http://pan.baidu.com/s/1n ...

  9. 洛谷 P1209 修理牛棚== Codevs 2079 修理牛棚

    时间限制: 1 s   空间限制: 128000 KB   题目等级 : 黄金 Gold 题目描述 Description 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹 ...

  10. c++ string 拼接 int错误

    程序中用到字符串和int合成字符串,受java习惯的影响,直接进行了字符串与int的+操作,结果不正确.查了一下才明白问题所在,记录一下string str=”abc”+1;输出为:bc,因为”abc ...