没有限制的话算一个组合数就好了。对于不小于某个数的限制可以直接减掉,而不大于某个数的限制很容易想到容斥,枚举哪些超过限制即可。

  一般情况下n、m、p都是1e9级别的组合数没办法算。不过可以发现模数已经被给出,并且这些模数的最大质因子幂都不是很大,那么扩展lucas就可以了。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int T,P,n,n1,n2,m,ans,a[];
int p[],b[],c[],s[],t,f[][];
void inc(int &x,int y,int p){x+=y;if (x>=p) x-=p;}
void exgcd(int a,int b,int &x,int &y)
{
if (b==)
{
x=,y=;
return;
}
exgcd(b,a%b,x,y);
int t=x;x=y;y=t-a/b*x;
}
int inv(int a,int p)
{
int x,y;
exgcd(a,p,x,y);
return (x+p)%p;
}
int ksm(int a,int k,int p)
{
if (k==) return ;
int tmp=ksm(a,k>>,p);
if (k&) return 1ll*tmp*tmp%p*a%p;
else return 1ll*tmp*tmp%p;
}
int fac(int n,int i)
{
if (n==) return ;
return 1ll*fac(n/p[i],i)*ksm(f[i][c[i]],n/c[i],c[i])%c[i]*f[i][n%c[i]]%c[i];
}
int C(int n,int m,int i)
{
int s=;
for (long long j=p[i];j<=n;j*=p[i]) s+=n/j;
for (long long j=p[i];j<=m;j*=p[i]) s-=m/j;
for (long long j=p[i];j<=n-m;j*=p[i]) s-=(n-m)/j;
if (s>=b[i]) return ;
return 1ll*fac(n,i)*inv(fac(m,i),c[i])%c[i]*inv(fac(n-m,i),c[i])%c[i]*ksm(p[i],s,c[i])%c[i];
}
int crt()
{
int ans=;
for (int i=;i<=t;i++)
inc(ans,1ll*s[i]*(P/c[i])%P*inv(P/c[i],c[i])%P,P);
return ans;
}
int calc(int n,int m)
{
if (n<m) return ;
for (int i=;i<=t;i++)
s[i]=C(n,m,i);
return crt();
}
void dfs(int k,int s,int m)
{
if (k>n1)
{
if (s&) inc(ans,(P-calc(m-,n-))%P,P);
else inc(ans,calc(m-,n-),P);
return;
}
dfs(k+,s+,m-a[k]);
dfs(k+,s,m);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj3129.in","r",stdin);
freopen("bzoj3129.out","w",stdout);
const char LL[]="%I64d";
#else
const char LL[]="%lld";
#endif
T=read(),P=read();
if (P==) t=,p[]=,b[]=,c[]=;
else if (P==)
{
t=;
p[]=,p[]=,p[]=,p[]=,p[]=;
b[]=,b[]=,b[]=,b[]=,b[]=;
c[]=,c[]=,c[]=,c[]=,c[]=;
}
else
{
t=;
p[]=,p[]=,p[]=;
b[]=,b[]=,b[]=;
c[]=,c[]=,c[]=;
}
for (int i=;i<=t;i++)
{
f[i][]=;
for (int j=;j<=c[i];j++)
if (j%p[i]==) f[i][j]=f[i][j-];
else f[i][j]=1ll*f[i][j-]*j%c[i];
}
while (T--)
{
n=read(),n1=read(),n2=read(),m=read();
for (int i=;i<=n1;i++) a[i]=read();
for (int i=;i<=n2;i++) m-=read()-;
ans=;
if (m>) dfs(,,m);
cout<<ans<<endl;
}
return ;
}

BZOJ3129 SDOI2013方程(容斥原理+扩展lucas)的更多相关文章

  1. BZOJ3129 [Sdoi2013]方程 【扩展Lucas】

    题目 给定方程 X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A X2 < = A2 Xn1 < = An1 我们对第n1 + 1..n1+n2个 ...

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

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

  3. 洛谷P3301 [SDOI2013]方程(扩展Lucas+组合计数)

    题面 传送门 题解 为啥全世界除了我都会\(exLucas\)啊--然而我连中国剩余定理都不会orz 不知道\(exLucas\)是什么的可以去看看yx巨巨的这篇博客->这里 好了现在我们就解决 ...

  4. bzoj3129[Sdoi2013]方程 exlucas+容斥原理

    3129: [Sdoi2013]方程 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 582  Solved: 338[Submit][Status][ ...

  5. bzoj千题计划267:bzoj3129: [Sdoi2013]方程

    http://www.lydsy.com/JudgeOnline/problem.php?id=3129 如果没有Ai的限制,就是隔板法,C(m-1,n-1) >=Ai 的限制:m减去Ai &l ...

  6. BZOJ3129: [Sdoi2013]方程

    拓展Lucas+容斥原理 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cs ...

  7. BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理

    BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理 Description 给定方程     X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A ...

  8. 【BZOJ3129】[SDOI2013]方程(容斥,拓展卢卡斯定理)

    [BZOJ3129][SDOI2013]方程(容斥,拓展卢卡斯定理) 题面 BZOJ 洛谷 题解 因为答案是正整数,所先给每个位置都放一个就行了,然后\(A\)都要减一. 大于的限制和没有的区别不大, ...

  9. 扩展CRT +扩展LUCAS

    再次感谢zyf2000超强的讲解. 扩展CRT其实就是爆推式子,然后一路合并,只是最后一个式子上我有点小疑惑,但整体还算好理解. #include<iostream> #include&l ...

随机推荐

  1. Redis 参数说明

    4. Redis的配置 4.1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 4.2. 当Redis以守护进程方式运行时,Redis ...

  2. Java实现几种常见排序方法

    日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 以下常见算法的定义 1. 插入排序:插入排序基本操作就是将一 ...

  3. ARM的9种寻址方式

    立即寻址 操作数是立即数,以“#”为前缀,表示 16 进制数值时以“0x”表示. 例: MOV   R0,#0xFF00   ;0xFF00 ->  R0 SUBS   R0,R0,#1     ...

  4. 基于TDA4863-2的单级PFC反激LED电源设计与仿真

    LED是一个非线性器件,正向电压的微小变化会引起电流的巨大变化:LED是一个半导体二极管,其伏安特性随温度变化而变化(-2mV/℃),假如温度升高,在恒压驱动下LED的电流会增加.长期超过额定电流工作 ...

  5. Codeforces Edu Round 63(Rated for Div. 2)

    感觉现在Edu场比以前的难多了…… A: 温暖人心 /* basic header */ #include <iostream> #include <cstdio> #incl ...

  6. Luogu P3177 [HAOI2015]树上染色

    一道有机结合了计数和贪心这一DP两大考点的神仙题,不得不说做法是很玄妙. 首先我们很容易想到DP,设\(f_{i,j}\)表示在以\(i\)为根节点的子树中选\(j\)个黑色节点的最大收益值. 然后我 ...

  7. shell脚本中的数据传递方式

    shell中支持的数据传递方式 主要有那么几种: 变量.管道.结果引用.重定向+文件.以及xargs. 变量方式: 1. 定义变量: 变量名=值 2. 使用变量: $变量名 管道方式: 统计当前文件夹 ...

  8. linux中fork, source和exec的区别

    转:linux中fork, source和exec的区别 shell的命令可以分为内部命令和外部命令. 内部命令是由特殊的文件格式.def实现的,如cd,ls等.而外部命令是通过系统调用或独立程序实现 ...

  9. Roslyn入门(一)-C#语法分析

    演示环境 Visual Studio 2017 .NET Compiler Platform SDK 简介 今天,Visual Basic和C#编译器是黑盒子:输入文本然后输出字节,编译管道的中间阶段 ...

  10. hexo——轻量、简易、高逼格的博客

    背景 写blog虽然经历了N多不同时代的产品,恒久不变的始终是自己无人问津的网站.虽然没几个人看,还是隔断时间就要折腾一下.从最开始的wordpress,到tale,到现在的hexo,网站变得越来越简 ...