正题

题目链接:https://www.luogu.com.cn/problem/P4640


题目大意

\(n\)种物品,其中\(t\)种物品是有个数限制的,第\(i\)种限制为\(b_i\),求选出\(m\)个物品的方案数\(\% p\)的值

\(1\leq n,m,b_i\leq 10^9,0\leq t\leq 15,p\in[1,10^5]\cap Pri\)


解题思路

看上去就很\(\text{OGF}\)的题目?

对于有限制的物品为\(f(x)=\frac{1-x^{b_i+1}}{1-x}\),其他都是\(f(x)=\frac{1}{1-x}\)。

然后\(n\)个乘起来的话然后求前\(m\)次项的系数。

分子因为只有\(t\)个有值,直接暴力乘起来。下面那个分母是\(\frac{1}{(1-x)^n}\)

所以对于上面如果有一个\(ax^{m-k}\)那么就会产生贡献

\[a\sum_{i=0}^{k}\binom{n+i-1}{n}=a\binom{n+k}{n}
\]

(相等于选出\(0\sim k\)个球放进\(n\)个盒子里,开一个垃圾箱把没用的球放进去就好了)

然后模数小,开\(Lucas\)就好了

时间复杂度\(O(2^t\log_p n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e5+10;
ll n,t,m,p,b[20],ans,inv[N],fac[N];
ll C(ll n,ll m)
{return fac[n]*inv[m]%p*inv[n-m]%p;}
ll L(ll n,ll m){
if(n<m)return 0;
if(n<p)return C(n,m);
return L(n/p,m/p)*L(n%p,m%p)%p;
}
signed main()
{
scanf("%lld%lld%lld%lld",&n,&t,&m,&p);
for(ll i=0;i<t;i++)scanf("%lld",&b[i]),b[i]++;
inv[1]=1;
for(ll i=2;i<p;i++)
inv[i]=p-inv[p%i]*(p/i)%p;
inv[0]=fac[0]=1;
for(ll i=1;i<p;i++)
fac[i]=fac[i-1]*i%p,inv[i]=inv[i-1]*inv[i]%p;
ll MS=(1<<t);
for(ll s=0;s<MS;s++){
ll f=1,sum=0;
for(ll i=0;i<t;i++)
if((s>>i)&1)f=-f,sum+=b[i];
(ans+=L(n+m-sum,n)*f)%=p;
}
printf("%lld\n",(ans+p)%p);
return 0;
}

最新文章

  1. Android中通信协议
  2. 不写完不回家的TreeSet
  3. 2015.10.15class
  4. Java多线程19:定时器Timer
  5. 关于JavaScript中对象的继承实现的学习总结
  6. UIPickerView详解
  7. Codeforces Round #337 Vika and Segments
  8. c程序设计语言_习题1-13_统计输入中单词的长度,并且根据不同长度出现的次数绘制相应的直方图
  9. playframework简单介绍
  10. C语言中Const与指针(转载)
  11. 玩转Web之servlet(五)---- 怎样解决servlet的线程安全问题
  12. light oj 1152 Hiding Gold
  13. 浅谈 RxAndroid + Retrofit + Databinding
  14. 2019Java查漏补缺(三)
  15. HBase的几个实示例
  16. Linux centos7下设置Tomcat开机自启动
  17. Django--20170905--笔记
  18. 有意思的随机数 Random
  19. 使用paramiko连接EC2主机
  20. matlab 下载

热门文章

  1. 3、二进制安装K8s之部署kube-apiserver
  2. C#---OleDbHelper
  3. c# 对 struct为什么不能继承类和结构的思考
  4. 十二:Servlet3.0的注解
  5. 二:Servlet简介
  6. servlet通过响应头Content-Disposition实现文件下载效果
  7. SpringBoot数据访问之整合mybatis注解版
  8. Swift- 设置 UILabel 内边距
  9. Longhorn 云原生容器分布式存储 - Python Client
  10. RHCS+Nginx及Fence机制实现高可用集群