Description

Input

Output

Sample Input

2 1 10 13

3

Sample Output

12

Source

看到t很小,想到用容斥原理,推一下发现n种数中选m个方法为C(n+m,m)。然后有的超过的就是先减掉b[i]+1,再算。由于n,m较大,p较小,故可用Lucas定理+乘法逆元搞。

把老师给的题解也放在这吧:

首先,看到有限制的只有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)求的时候要用到乘法逆元。

 program babylon(input,output);
var
t,i:longint;
ans,n,m,j,p:int64;
b:array[..]of int64;
a:array[..]of int64;
function pow(x,y:int64):int64;
begin
pow:=;
while y> do
begin
if y mod = then pow:=pow*x mod p;
x:=x*x mod p;
y:=y>>;
end;
end;
function z(n,m:int64):int64;
begin
if n<m then exit();
exit(a[n]*pow(a[n-m]*a[m] mod p,p-) mod p);
end;
function c(n,m:int64):int64;
begin
if n<m then exit();
c:=;
while (n>) and (m>) do
begin
c:=c*z(n mod p,m mod p) mod p;
n:=n div p;m:=m div p;
end;
end;
procedure dfs(k:longint;r,s:int64);
begin
if k=t+ then
begin
ans:=(ans+r*c(n+m-s,n)) mod p;
exit;
end;
dfs(k+,r,s);
dfs(k+,-r,s+b[k]+);
end;
begin
assign(input,'babylon.in');assign(output,'babylon.out');reset(input);rewrite(output);
readln(n,t,m,p);
for i:= to t do read(b[i]);
a[]:=;j:=;
while j<p do begin inc(j);a[j]:=a[j-]*j mod p; end;
ans:=;
dfs(,,);
if ans< then ans:=ans+p;write(ans);
close(input);close(output);
end.

最新文章

  1. MySql数据源配置
  2. JDBC增删改查,PreparedStatement和Statement的区别
  3. noSession or session is close 错误
  4. ERP基本功——物料的四个量
  5. python调试总结
  6. 分布式助手Zookeeper(四)
  7. apache SetEnv 设置
  8. Python unittest 官方文档
  9. hdu 1316 How Many Fibs? (模拟高精度)
  10. windows平台下载android源代码
  11. 安卓Service完全解析(中)
  12. Lua语言模型 与 Redis应用
  13. 利用BGP虚拟下一跳实现链路负载均衡
  14. WCF 寄宿Windows以及控制台启动
  15. ORACLE_11G归档空间满,由于数据库装完后使用的是默认空间是闪回区
  16. centos7系统下,配置学校客户端网络记录
  17. nginx 502错误 upstream sent too big header while reading response header from upstream
  18. UDP中使用bind和connect的作用
  19. 详解C#泛型(三)
  20. php 会话控制(关于cookie的维护与生命周期)

热门文章

  1. 20155338 《JAVA程序设计》实验五网络编程与安全实验报告
  2. 21045234黄斐《java程序设计》第四周
  3. php 换行 PHP_EOL
  4. [BZOJ1565][NOI2009]植物大战僵尸-[网络流-最小割+最大点权闭合子图+拓扑排序]
  5. Angular开发者手册重点翻译之指令(一)
  6. artDialog基本使用
  7. Laya 自适应 不拉伸处理
  8. vim—多行注释、取消多行注释
  9. java引用Arcface,实现人脸识别(demo)
  10. 15 分钟用 ML 破解一个验证码系统