洛谷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 ...
 
随机推荐
- Anti-pattern(反模式)
			
常见的与“直觉”相背离的 anti-pattern 产生的实际原因是我们没有深入全面地考虑问题. 即只关注到自己关心的方面,忽略了其他重要的.恰好起相反作用的因素. 所以这个“直觉”是不成熟.不全面的 ...
 - canvas绘制中的API
			
canvas绘制Z 先贴代码吧: /** * Created by Administrator on 2016/1/26. */ var i; function draw (id){ var canv ...
 - 如何修改AWR的retention,interval
			
检查AWR当前设置: SQL> select * from dba_hist_wr_control; DBID SNAP_INTERVAL RETENTION TOPNSQL --------- ...
 - Solaris11 How-To
			
允许root用户使用ftp - 修改/etc/ftpd/ftpusers文件,移除或注释掉"root" - 修改/etc/proftpd.conf文件,"RootLogi ...
 - 图解JVM和Tomcat类加载机制
			
说到本篇的tomcat类加载机制,不得不说翻译学习tomcat的初衷. 之前实习的时候学习javaMelody的源码,但是它是一个Maven的项目,与我们自己的web项目整合后无法直接断点调试.后来同 ...
 - S2SH整合所需jar包及其详解
			
转自:https://blog.csdn.net/vvvac1314/article/details/44002205 struts2所必须的jar包五个:struts2-core-2.1.6.jar ...
 - DAY13-前端之jQuery
			
jQuery jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行 ...
 - Yaffs2根文件系统制作
			
Yaffs2根文件系统制作 环境: 交叉编译环境:4.4.6 开发平台:s3c2416 1,编译busybox 获取busybox源码busybox-1.17.2.tar (http://www.bu ...
 - 正则表达式计算 origin = "1 - 2 * ( ( 60 - 30 + ( -40.0 / 5 ) * ( 9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14 )) - ( - 4 * 3 ) / ( 16 - 3 * 2))"
			
#!/usr/bin/env python import re def f1(arg): return 1 origin = "1 - 2 * ( ( 60 - 30 + ( -40.0 / ...
 - js对象排序&&倒序
			
按照对象的值大小排序对象 function sortObj(obj) { var arr = []; for (var i in obj) { arr.push([obj[i],i]); }; arr ...