Gate Of Babylon

Time Limit: 10 Sec  Memory Limit: 162 MB
[Submit][Status][Discuss]

Description

  

Input

  

Output

  

Sample Input

  2 1 10 13
  3

Sample Output

  12
  

HINT

  

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)求的时候要用到乘法逆元。

Code

 #include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std; const int ONE=; int n,T,m,MOD;
long long Ans;
long long Jc[ONE];
int b[ONE]; int get()
{
int res,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} long long Quickpow(int a,int b,int MOD)
{
long long res=;
while(b)
{
if(b&) res=res*a%MOD;
a=(long long)a*a%MOD;
b/=;
}
return res;
} int C(int m,int n)
{
if(m<n) return ;
int up=Jc[m]%MOD;
int down=(long long)Jc[m-n]*Jc[n]%MOD;
return (long long)up*Quickpow(down,MOD-,MOD)%MOD;
} int Lucas(int n,int m,int MOD)
{
long long res=;
if(n<m) return ;
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+)
{
Ans+=PD*Lucas(n+m-val,m-val,MOD);
Ans+=MOD;
Ans%=MOD;
return;
}
Dfs(len+,PD,val);
Dfs(len+,-PD,val+b[len]+);
} int main()
{
n=get(); T=get(); m=get(); MOD=get();
Jc[]=; for(int i=;i<=MOD;i++) Jc[i]=(long long)Jc[i-]*i%MOD;
for(int i=;i<=T;i++)
b[i]=get();
Dfs(,,);
printf("%d",Ans);
}

最新文章

  1. spider RPC管理接口
  2. 元素的click与dblclick
  3. 在.net中读写config文件的各种方法
  4. 1 javascript 核心语言笔记
  5. js正则匹配只能输入有效数字可加小数点
  6. 转:Jmeter之Bean shell使用(二)
  7. 【shell】通配符
  8. Java中数组复制的几种方法
  9. Java API ——StringBuffer类
  10. Matlab 之 im2col
  11. String常用方法总结
  12. Android 之窗口小部件高级篇--App Widget 之 RemoteViews - 跨到对岸去
  13. SilkTest天龙八部系列6-用open agent进行测试
  14. jquery checkbox 操作
  15. 递归添加 另一个ds 里的DataRow 时 报错:该行已经属于另一个表。
  16. CLR类型设计之属性
  17. js选中变色,不选中鼠标放上变色
  18. SpringBoot日记——Spring的安全配置-登录认证与授权
  19. bugkuct部分writeup 持续更新
  20. Python 编码规范(Google)

热门文章

  1. Swift-assert使用时机
  2. PokeCats开发者日志(十四)——终章
  3. 解决chrome css本地映射不成功&amp;&amp;附带映射方法
  4. springMVC视图有哪些?-009
  5. asp.net 间隔一段时间执行某方法
  6. BZOJ 1305 跳舞(二分+网络流)
  7. 计蒜客 17417 Highest Tower(思维+图论)
  8. A表数据插入到B表(表结构不一致)
  9. 2017 ICPC beijing F - Secret Poems
  10. atom的快捷键,你hold住吗?