P4640-[BJWC2008]王之财宝【OGF,Lucas定理】
正题
题目链接: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}\)那么就会产生贡献
\]
(相等于选出\(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;
}
P4640-[BJWC2008]王之财宝【OGF,Lucas定理】的更多相关文章
- Luogu4640 BJWC2008 王之财宝 容斥、Lucas
传送门 题意:有$N$种物品,其中$T$个物品有限定数量$B_i$,其他则没有限定.问从中取出不超过$M$个物品的方案数,对质数$P$取模.$N,M \leq 10^9 , T \leq 15 , P ...
- [BJWC2008]王之财宝
嘟嘟嘟 如果没有限制,而且必须选\(m\)件的话,就是隔板法\(C_{n + m - 1} ^ {m - 1}\)了.现在要选至多\(m\)件,那么就相当于新增一个板儿,分出的新的盒子表示" ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- CF451E Devu and Flowers (隔板法 容斥原理 Lucas定理 求逆元)
Codeforces Round #258 (Div. 2) Devu and Flowers E. Devu and Flowers time limit per test 4 seconds me ...
- 大组合数:Lucas定理
最近碰到一题,问你求mod (p1*p2*p3*……*pl) ,其中n和m数据范围是1~1e18 , l ≤10 , pi ≤ 1e5为不同的质数,并保证M=p1*p2*p3*……*pl ≤ 1e18 ...
- 【BZOJ-4591】超能粒子炮·改 数论 + 组合数 + Lucas定理
4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 95 Solved: 33[Submit][Statu ...
- 组合数取模Lucas定理及快速幂取模
组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1) , 此时较简单,在O(n2)可承受的情况下组合数的计算可以 ...
- hdu 3037 Saving Beans Lucas定理
Saving Beans Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- 【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理
Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...
随机推荐
- Leaflet 中 删除 一组 标记(Marker)
动态显示一个标签: L.marker([obj.Y,obj.X]).addTo(map).bindPopup(obj.name).openPopup(); let layers=[]; let myG ...
- Java常用类之时间类
JDK8之前日期时间API 1. java.lang.System类 2. java.util.Date类 3. java.text.SimpleDateFormat类 4. java.util.Ca ...
- 如何在github上传本地项目代码
首先你要在github上申请一个账号 网址:https://github.com/ 然后你要下载一个git工具 网址:https://gitforwindows.org/ 进入官网直接下载就行,下载完 ...
- C#设计模式---模板方法模式(Template Method Pattern)
一.目的 模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码. 二.定义 模板方法模式:在一个抽象类中定义一个操作的算法骨架,将算法骨架中某些特定的操作延迟到子类中实现. 模板方法使得子类在 ...
- Oracle基本用法(一)
一.简介 数据库:Oracle数据库的概念和其他数据库不一样,这里的数据库是一个操作系统只有一个库,可以看做Oracle就是一个大的数据库. 实例:一个Oracle实例有一系列的后台进程和内存结构组成 ...
- css - 响应式
css - 响应式 移动设备尺寸 移动设备的尺寸各不相同,大体上可以做如下划分: 768px以下的是手机屏幕 768px-991px是平板ipad屏幕 992px-1199是大平板屏幕 1200极其以 ...
- JDBC基础篇(MYSQL)——使用CallabeStatement调用存储过程
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package day04_callable; import java.sql.CallableStatement; import ...
- ProjectEuler 005题
题目: 2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any ...
- [题解] P4556 [Vani有约会]雨天的尾巴
[题解] P4556 [Vani有约会]雨天的尾巴 ·题目大意 给定一棵树,有m次修改操作,每次修改 \(( x\) \(y\) \(z )\) 表示 \((x,y)\) 之间的路径上数值 \(z\) ...
- easycode一键生成