洛谷P3301 [SDOI2013]方程(扩展Lucas+组合计数)
题面
题解
为啥全世界除了我都会\(exLucas\)啊……然而我连中国剩余定理都不会orz
不知道\(exLucas\)是什么的可以去看看yx巨巨的这篇博客->这里
好了现在我们就解决了计算组合数的问题了,接下来问题就在于怎么计算了
首先如果是强制大于等于很简单,设条件分别为\(x_i\geq A_i\),那么方案数就是\({m-\sum(A_i-1)-1\choose n-1}\),用隔板法就能证明
然而现在前面一部分是小于等于,这好办,我们把它化成\(x_i\geq A_i+1\),这样就方便计算了,然后用容斥来计算正确的答案
然后没有然后了
//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
const int N=11005;
int n,m,P,T,n1,n2,res,cnt,x,fac[N],pi[11],pk[11],a[11];
int read(){
R int res,f=1;R char ch;
while((ch=getchar())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getchar())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
int ksm(R int x,R int y,R int p){
R int res=1;
for(;y;y>>=1,x=1ll*x*x%p)if(y&1)res=1ll*res*x%p;
return res;
}
void exgcd(int a,int b,int &x,int &y){
if(!b)return x=1,y=0,void();
exgcd(b,a%b,y,x),y-=a/b*x;
}
inline int inv(int n,int p){
if(!n)return 0;
int x,y;exgcd(n,p,x,y);
x=(x%p+p)%p;return x?x:x+p;
}
void Pre(int pi,int pk){
fac[0]=1;
fp(i,1,pk)fac[i]=(i%pi)?1ll*fac[i-1]*i%pk:fac[i-1];
}
int Fac(int n,int pi,int pk){
if(!n)return 1;
int res=ksm(fac[pk],n/pk,pk);
return 1ll*res*fac[n%pk]%pk*Fac(n/pi,pi,pk)%pk;
}
int C(int n,int m,int pi,int pk){
// printf("%d %d %d %d\n",n,m,pi,pk);
if(m>n)return 0;
int a=Fac(n,pi,pk),b=Fac(m,pi,pk),c=Fac(n-m,pi,pk),res,k=0;
for(R int i=n;i;i/=pi)k+=i/pi;
for(R int i=m;i;i/=pi)k-=i/pi;
for(R int i=n-m;i;i/=pi)k-=i/pi;
res=1ll*a*inv(b,pk)%pk*inv(c,pk)%pk*ksm(pi,k,pk)%pk;
return 1ll*res*(P/pk)%P*inv(P/pk,pk)%P;
}
int exLucas(int n,int m){
if(m>n)return 0;
int res=0;
fp(i,1,cnt)Pre(pi[i],pk[i]),(res+=C(n,m,pi[i],pk[i]))%=P;
return res;
}
void solve(){
n=read(),n1=read(),n2=read(),m=read();
fp(i,0,n1-1)a[i]=read();
fp(i,1,n2)m-=read()-1;
int lim=(1<<n1),res=0;
fp(i,0,lim-1){
int s=m,t=1;
fp(j,0,n1-1)if(i>>j&1)s-=a[j],t=P-t;
if(s-1<0)continue;
(res+=1ll*exLucas(s-1,n-1)*t%P)%=P;
}
printf("%d\n",res);
}
void init(){
int x=P;
for(R int i=2;1ll*i*i<=x;++i)if(x%i==0){
pi[++cnt]=i,pk[cnt]=1;
while(x%i==0)pk[cnt]*=i,x/=i;
}
if(x>1)++cnt,pi[cnt]=pk[cnt]=x;
}
int main(){
// freopen("testdata.in","r",stdin);
T=read(),P=read(),init();
while(T--)solve();
return 0;
}
洛谷P3301 [SDOI2013]方程(扩展Lucas+组合计数)的更多相关文章
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 洛谷P1378 油滴扩展(搜索)
洛谷P1378 油滴扩展 直接暴力搜索更新答案就可以了. 时间复杂度为 \(O(n!)\) . #include<stdio.h> #include<stdlib.h> #in ...
- BZOJ 3129 [SDOI2013]方程 (拓展Lucas)
题目大意:给定一个方程$X_{1}+X_{2}+X_{3}+X_{4}+...+X_{n}=M$,$\forall X_{i}<=A_{i} (i<=n1)$ $\forall X_{i} ...
- [洛谷P3304] [SDOI2013]直径
洛谷题目链接:[SDOI2013]直径 题目描述 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅 ...
- 【题解】洛谷P3166 [CQOI2014] 数三角形(组合+枚举)
洛谷P3166:https://www.luogu.org/problemnew/show/P3166 思路 用组合数求出所有的3个点组合(包含不合法的) 把横竖的3个点共线的去掉 把斜的3个点共线的 ...
- 洛谷1378 油滴扩展 dfs进行回溯搜索
题目链接:https://www.luogu.com.cn/problem/P1378 题目中给出矩形的长宽和一些点,可以在每个点放油滴,油滴会扩展,直到触碰到矩形的周边或者其他油滴的边缘,求出剩余面 ...
- Bzoj3197/洛谷3296 [SDOI2013]刺客信条assassin(树的重心+树Hash+树形DP+KM)
题面 Bzoj 洛谷 题解 (除了代码均摘自喻队的博客,可是他退役了) 首先固定一棵树,枚举另一棵树,显然另一棵树只有与这棵树同构才有可能产生贡献 如果固定的树以重心为根,那么另一棵树最多就只有重心为 ...
- 【题解】洛谷P1313 [NOIP2011TG]计算系数(组合+二次项展开)
洛谷P1313:https://www.luogu.org/problemnew/show/P1313 思路 本题就是考查二次项展开 根据定理有:(ax+by)k=∑ki=0Cik*aibk-ixiy ...
- BZOJ3129/洛谷P3301方程(SDOI2013)容斥原理+扩展Lucas定理
题意:给定方程x1+x2+....xn=m,每个x是正整数.但是对前n1个数做了限制x1<=a1,x2<=a2...xn1<=an1,同时对第n1+1到n1+n2个数也做了限制xn1 ...
随机推荐
- Spring MVC 项目示例
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架.Spring的web框架围绕DispatcherServlet设计, 作用是将请求分发到不同 ...
- tree指令
tree 中文解释:tree功能说明:以树状图列出目录的内容.语 法:tree [-aACdDfFgilnNpqstux][-I <范本样式>][-P <范本样式>][目录.. ...
- docker 安装mysql 使用navicat访问 解决
1. 下载Mysql的Docker镜像: 2. 运行镜像,设置root账号初始密码(123456),映射本地宿主机端口3306到Docker端口3306.测试过程没有挂载本地数据盘: 3. 查看已运行 ...
- DDD学习笔录——领域驱动设计DDD概念总结
- 来自T00ls的帖子-XSS的奇技淫巧
T00LS在前段时间开启了markdown支持,这个漏洞也正是markdown的问题导致. Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定 ...
- office 2010打开doc文档报错:Word 在尝试打开文件时遇到错误
今天在百度文库中下载了几个文档,下载后发现无法打开.出现以下的提示框. 那么,使用多年office的我,这点小问题当然难不倒我啦. 这个问题是由于系统安全设置所导致的 ,所有我们只需要处理这个安全设置 ...
- 使用ServerSocket建立聊天服务器(一)
-------------siwuxie095 工程名:TestMyServerSocket 包名:com.siwuxie095.socket ...
- ROS与Matlab系列:一个简单的运动控制
ROS与Matlab系列:一个简单的运动控制 转自:http://blog.exbot.net/archives/2594 Matlab拥有强大的数据处理.可视化绘图能力以及众多成熟的算法函数,非常适 ...
- 初步认识ASP.NET WebForm
C#可已进行以下两大类的开发 一.客户端应用程序C/S 主要有两种开发技术: 1.winForm windows窗体应用程序 2.WPF微软新一代图形框架 MFC(比较老的开发技术) MVVM(客户端 ...
- jetty启动常用命令
1. 启动Jetty Server:运行命令:Java -jar start.jar 指定项目名称启动: java -jar start.jar -Dname=zoush 保持jetty后台 ...