《基尔伽美修》是人类历史上第一部英雄史诗,两河流域最杰出的文学作品之一。作品讲述了基尔伽美修一生的传
奇故事。在动画Fate/staynight中,基尔伽美修与亚瑟王等传说中的英雄人物一起出现在了现实世界,展开了一
场惊天地、泣鬼神的战斗一·在记载于12块泥板的史诗中,基尔伽美修与同伴安吉杜一起降伏了森林的守护者——
神兽洪芭芭,成为地上最强的王者,同时将世间所有财宝收归手中。王之财宝(GateofBabylon)成为Fate中金皮卡
(基尔伽美修的外号…)炫耀的资本……一天金皮卡突发奇想:如果从自己无尽的财宝里面,随便抽不超过M件宝
具出来砸死敌人的话。一共有多少种搭配方法呢一一?假设金皮卡一共有N种不同类型的宝具,大部分类型的宝具
都有无限多,但其中T种超级神器的数量是有限的。设第i种超级神器的数量不超过Bi件。若相同类型的宝具数量相
同,则认为是相同的搭配方案。金皮卡知道方案数会很大,从小数学成绩就好的他挑选了一个质数P,请你帮他计
算一下方案数模P后的余数。注意,一件也不选也是一种方案。
Input

第一行包含4个整数,分别为N,T,M,P
之后T行,每行一个鏊数,代表Bi
N,M≤10^9,P≤10^5,Bi≤10^9
0≤T≤N,M>O,Bi>0,T≤15
Output

仅包含一个整数,即方案数模P后的余数。
Sample Input
2 1 10 13
3
Sample Output
12

【样例说明1】
只有一种超级神器,数量不超过3
当不选择超级神器时,另一种宝具可以挑选0到10件,共11种方案
当选择1件神器出来时,另一种宝具可以挑选0到9件,共10种方案
当挑选2件神器时,共9种方案
挑选3件神器时,共8种方案
一共有11+10+9+8=38种方案,38mod13=12,于是答案等于12

Main idea
  有若干个没有限制的道具,以及T个有限制个数的道具,取出m个,求方案数。
Solution
  首先,看到有限制的只有15个,因此可以考虑使用容斥原理:Ans=全部没有限制的方案-有1个超过限制的方案数+有2个超过限制的方案数-有3个超过限制的方案数…。
  以此类推。我们先考虑没有限制的,在m组无限制的数中选n个的方案数,显然就是C(n+m-1,n)。
  因为这道题是要求不超过m的方案数,也就是那么运用加法原理,发现答案也就是C(n+0-1,0)+C(n+1-1,1)+C(n+2-1,2)+...+C(n+m-1,m)=C(n+m,m)。
  然后考虑有限制的情况,有一个超过限制直接用总数减去(这个的限制+1)就是当前的总数,相当于强制要选限制+1个为空。
  然后只要DFS,记录到当前为止选了几个,答案要记是b[i]+1,判断加减,最后累加答案。
  最后,n、m过大,发现p是一个质数,所以可以用Lucas定理:Lucas(n,m,p)=Lucas(n/p,m/p,p)*C(n%p,m%p),其中C(n%p,m%p)求的时候要用到乘法逆元。

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std; const int ONE=1000001; int n,T,m,MOD;
long long Ans;
long long Jc[ONE];
int b[ONE]; int get()
{
int res,Q=1; char c;
while( (c=getchar())<48 || c>57)
if(c=='-')Q=-1;
if(Q) res=c-48;
while((c=getchar())>=48 && c<=57)
res=res*10+c-48;
return res*Q;
} long long Quickpow(int a,int b,int MOD)
{
long long res=1;
while(b)
{
if(b&1) res=res*a%MOD;
a=(long long)a*a%MOD;
b/=2;
}
return res;
} int C(int m,int n)
{
if(m<n) return 0;
int up=Jc[m]%MOD;
int down=(long long)Jc[m-n]*Jc[n]%MOD;
return (long long)up*Quickpow(down,MOD-2,MOD)%MOD;
} int Lucas(int n,int m,int MOD)
{
long long res=1;
if(n<m) return 0;
while(n && m)
{
res=res*C(n%MOD,m%MOD)%MOD;
n/=MOD; m/=MOD;
}
return res;
} void Dfs(int len,int PD,int val)
{
if(len==T+1)
{
Ans+=PD*Lucas(n+m-val,m-val,MOD);
Ans+=MOD;
Ans%=MOD;
return;
}
Dfs(len+1,PD,val);
Dfs(len+1,-PD,val+b[len]+1);
} int main()
{
n=get(); //n种物品
T=get(); //t种特殊的
m=get(); //取出m个
MOD=get(); //对答案取mod
Jc[0]=1;
for(int i=1;i<=MOD;i++)
Jc[i]=(long long)Jc[i-1]*i%MOD;
for(int i=1;i<=T;i++)
b[i]=get();
Dfs(1,1,0);
printf("%d",Ans);
} /*
input
3 2 10 10007
3
4
output
150
手动算一下
C(n+m,m)
没有任何限制的时候,其实就是方程
x+y+z<=10(注意是<=10)
n=3,m=10
C(13,3)=286
第一种不满足条件,即x>=4
则方程变为x+y+z<=6
其方案数为C(3+6,3)=84
第一种不满足条件,即y>=5
则方程变为x+y+z<=5
其方案数为C(3+5,3)=56
这两种要减去之
再加上多减的则方程
x+y+z<=10-4-5=1的解
共C(3+1,3)=4
于是结果为286-84-56+4=150
*/

  

[BeiJingWc2008]Gate Of Babylon的更多相关文章

  1. BZOJ1272: [BeiJingWc2008]Gate Of Babylon

    题解: 多重集合的组合数?还是0-m?有些元素有个数限制? 多重集合的组合数可以插板法,0-m直接利用组合数的公式一遍求出来,个数限制注意到只有15个,那我们就暴力容斥了 AC了真舒畅.. 注意开lo ...

  2. 【BZOJ 1272】 1272: [BeiJingWc2008]Gate Of Babylon (容斥原理+卢卡斯定理)

    1272: [BeiJingWc2008]Gate Of Babylon Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 254  Solved: 12 ...

  3. bzoj 1272: [BeiJingWc2008]Gate Of Babylon

    Description Solution 如果没有限制,答案就是 \(\sum_{i=0}^{m}C(n+i-1,i)\) 表示枚举每一次取的个数,且不超过 \(m\),方案数为可重组合 发现这个东西 ...

  4. ●BZOJ 1272 [BeiJingWc2008]Gate Of Babylon

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1272 题解: 容斥,Lucas定理本题的容斥考虑类似 [BZOJ 1042 [HAOI200 ...

  5. 【BZOJ】【1272】【BeiJingWC2008】Gate of Babylon

    组合数学+容斥原理 Orz zyf-zyf 多重集组合数0.0还带个数限制?  ——>  <组合数学>第6章  6.2带重复的组合 组合数还要模P 0.0? ——> Lucas ...

  6. Gate Of Babylon bzoj 1272

    Gate Of Babylon (1s 128MB) babylon [问题描述] [输入格式] [输出格式] [样例输入] 2 1 10 13 3 [样例输出] 12 [样例说明] [数据范围] 题 ...

  7. 【BZOJ1272】Gate Of Babylon [Lucas][组合数][逆元]

    Gate Of Babylon Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description Input ...

  8. bzoj1272 Gate Of Babylon(计数方法+Lucas定理+乘法逆元)

    Description Input Output Sample Input 2 1 10 13 3 Sample Output 12 Source 看到t很小,想到用容斥原理,推一下发现n种数中选m个 ...

  9. bzoj1272 Gate Of Babylon

    [问题描述] [输入格式] [输出格式] [样例输入] 2 1 10 13 3 [样例输出] 12 [样例说明] [数据范围] 先容斥,考虑枚举哪些条件强制不满足,即直接选出b[i]+1件宝具 假设强 ...

随机推荐

  1. hihocoder1384/CH0601 Genius ACM[贪心+倍增+归并排序]

    提交地址. 关于lyd给的倍增方法,即从当前枚举向后的$2^k$长度($k$从$1$开始),如果可行就将$k$加一以扩大范围,不可行时将范围不断减半直至$0$. 举个例子,假设当下在1,目标答案是13 ...

  2. python--Excel模块xlwings

    安装:pip install xlwings 基本操作: xlwings的特色: xlwings能够非常方便的读写Excel文件中的数据,并且能够进行单元格格式的修改 可以和matplotlib以及p ...

  3. 【NOIP2017提高A组模拟10.7】Adore

    题目 小w 偶然间见到了一个DAG. 这个DAG 有m 层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k 个节点. 现在小w 每次可以取反第i(1 < i < n - 1) ...

  4. Coding 账户与 本地 Git 客户端的配置

    1.先创建cooding账户 ,注册地址:https://coding.net/ 2.创建好账户后登陆,在个人设置中  验证邮箱 和 验证手机 (邮箱很重要配置需要用到) 3.安装git 客户端 (在 ...

  5. 29. ClustrixDB 分布式架构/并发控制

    介绍 ClustrixDB使用多版本并发控制(MVCC)和2阶段锁(2PL)的组合来支持混合的读写工作负载.在我们的系统中,读取器享受无锁快照隔离,而写入器使用2PL来管理冲突.并发控制的组合意味着读 ...

  6. 2018美团CodeM编程大赛初赛B轮 A题开关灯

    题目描述 美团的办公室一共有n层,每层有m个会议室,可以看成是一个n*m的网格图.工程师们每天的工作需要协作的地方很多,经常要到会议室开会解决各种问题.公司是提倡勤俭节约的,因此每次会议室只在使用时才 ...

  7. AtCoder4351 Median of Medians 二分, 树状数组

    题目大意 定义一个从小到大的数列的中位数为第 $ \frac{n}{2}+1 $ 项.求一个序列的所有连续子序列的中位数的中位数. $ (n \leqslant 100000)$ 问题分析 由于\(n ...

  8. 并发量,tps,qps

    QPS/TPS/并发量/系统吞吐量的概念 2017年08月13日 17:24:47 阅读数:10682 我们在日常工作中经常会听到QPS/TPS这些名词,也会经常被别人问起说你的系统吞吐量有多大.这个 ...

  9. 事件源event.target

    今天在了解检测浏览器是否能播放不同类型的视频时发现以下代码 <script> function supportType(e,vidType,codType) { myVid=documen ...

  10. Scrum立会报告+燃尽图 02

    本次作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9912 一.小组情况组长:贺敬文组员:彭思雨 王志文 位军营 徐丽君队名 ...