题面

传送门

题解

为啥全世界除了我都会\(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+组合计数)的更多相关文章

  1. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  2. 洛谷P1378 油滴扩展(搜索)

    洛谷P1378 油滴扩展 直接暴力搜索更新答案就可以了. 时间复杂度为 \(O(n!)\) . #include<stdio.h> #include<stdlib.h> #in ...

  3. 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} ...

  4. [洛谷P3304] [SDOI2013]直径

    洛谷题目链接:[SDOI2013]直径 题目描述 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅 ...

  5. 【题解】洛谷P3166 [CQOI2014] 数三角形(组合+枚举)

    洛谷P3166:https://www.luogu.org/problemnew/show/P3166 思路 用组合数求出所有的3个点组合(包含不合法的) 把横竖的3个点共线的去掉 把斜的3个点共线的 ...

  6. 洛谷1378 油滴扩展 dfs进行回溯搜索

    题目链接:https://www.luogu.com.cn/problem/P1378 题目中给出矩形的长宽和一些点,可以在每个点放油滴,油滴会扩展,直到触碰到矩形的周边或者其他油滴的边缘,求出剩余面 ...

  7. Bzoj3197/洛谷3296 [SDOI2013]刺客信条assassin(树的重心+树Hash+树形DP+KM)

    题面 Bzoj 洛谷 题解 (除了代码均摘自喻队的博客,可是他退役了) 首先固定一棵树,枚举另一棵树,显然另一棵树只有与这棵树同构才有可能产生贡献 如果固定的树以重心为根,那么另一棵树最多就只有重心为 ...

  8. 【题解】洛谷P1313 [NOIP2011TG]计算系数(组合+二次项展开)

    洛谷P1313:https://www.luogu.org/problemnew/show/P1313 思路 本题就是考查二次项展开 根据定理有:(ax+by)k=∑ki=0Cik*aibk-ixiy ...

  9. BZOJ3129/洛谷P3301方程(SDOI2013)容斥原理+扩展Lucas定理

    题意:给定方程x1+x2+....xn=m,每个x是正整数.但是对前n1个数做了限制x1<=a1,x2<=a2...xn1<=an1,同时对第n1+1到n1+n2个数也做了限制xn1 ...

随机推荐

  1. centos7的xfs配置

    XFS是扩展性高.高性能的文件系统.也是rhel7/centos7的默认文件系统.XFS支持metadata journaling,这使其能从crash中更快速的恢复.它也支持在挂载和活动的状态下进行 ...

  2. 11-02SQLserver基础--字符串函数

    数据库の函数 一.内置函数--字符串函数 1.--ASCII 返回字符串的首字母的ASCII编码 select ASCII('ame') select ASCII(xingming)from xues ...

  3. 问题:oracle 字符串转换成日期;结果:[oracle] to_date() 与 to_char() 日期和字符串转换

    to_date("要转换的字符串","转换的格式")   两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. to_char(日期,& ...

  4. C#如何拿到从http上返回JSON数据?

    第一章:C#如何拿到从http上返回JSON数据? 第二章:C#如何解析JSON数据?(反序列化对象) 第三章:C#如何生成JSON字符串?(序列化对象) 第四章:C#如何生成JSON字符串提交给接口 ...

  5. Cookies和Session的定义与区别

    Cookies和Session二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来.当下次你再光临同一个网 ...

  6. NoSQL概述

  7. spring 的aop操作

  8. 复选框操作checked选中为true,反之为False,也可以赋值为true,false

  9. Comparatable接口和Comparator接口的使用与区别

    这篇博文可以为你解决的问题如下: 什么是自然排序 Collections.sort()与Arrays.sort()的异同点 Comparatable接口和Comparator接口各自的排序依据(理论讲 ...

  10. Spring 已看 没用

    注解 @Autwired 依赖注入  作用: 自动按照类型注入.当使用注解注入属性时,set方法可以省略.它只能注入其他bean类型.当有多个类型匹配时,使用要注入的对象变量名称作为bean的id,在 ...