http://www.lydsy.com/JudgeOnline/problem.php?id=3129

如果没有Ai的限制,就是隔板法,C(m-1,n-1)

>=Ai 的限制:m减去Ai

<=Ai 的限制:容斥原理,总数- 至少有一个数>Ai + 至少有两个数>Ai - ……

计算组合数取模,模数虽然很大也不是质数,但是质因数分解后 最大的才 10201,所以用扩展卢卡斯即可

注意在用扩展卢卡斯计算 阶乘的时候,要预处理 不包含当前质因子的阶乘,否则会TLE 3个点

#include<cstdio>
#include<iostream> using namespace std; typedef long long LL; LL p; int up[],down[]; int num;
int PI[],PK[]; LL fac[]; template<typename T>
void read(T &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void pre()
{
LL t=p;
for(LL i=;i*i<=p;++i)
if(!(t%i))
{
PI[++num]=i;
PK[num]=;
while(!(t%i)) t/=i,PK[num]*=i;
}
if(t>)
{
PI[++num]=t;
PK[num]=t;
}
} LL Pow(LL a,LL b,LL mod)
{
LL res=;
for(;b;b>>=,a=a*a%mod)
if(b&) res=res*a%mod;
return res;
} void exgcd(LL a,LL b,LL &x,LL &y)
{
if(!b) { x=; y=; return; }
exgcd(b,a%b,y,x); y-=a/b*x;
} LL get_inv(LL a,LL b)
{
LL x,y;
exgcd(a,b,x,y);
x=(x%b+b)%b;
return x;
} LL get_fac(int n,LL pk,LL pi)
{
if(!n) return ;
LL ans=;
if(n/pk) ans=Pow(fac[pk],n/pk,pk);
ans=ans*fac[n%pk]%pk;
return ans*get_fac(n/pi,pk,pi)%pk;
} LL exlucas(int n,int m,LL pk,LL pi)
{
fac[]=;
for(int i=;i<=pk;++i)
{
fac[i]=fac[i-];
if(i%pi) fac[i]=fac[i]*i%pk;
}
LL fn=get_fac(n,pk,pi);
LL fm=get_fac(m,pk,pi);
LL fnm=get_fac(n-m,pk,pi);
LL k=;
for(int i=n;i;i/=pi) k+=i/pi;
for(int i=m;i;i/=pi) k-=i/pi;
for(int i=n-m;i;i/=pi) k-=i/pi;
LL ans=fn*get_inv(fm,pk)%pk*get_inv(fnm,pk)%pk*Pow(pi,k,pk)%pk;
return ans*(p/pk)%p*get_inv(p/pk,pk)%p;
} LL get_C(int n,int m)
{
if(n<m) return ;
LL ans=;
LL pk;
for(int i=;i<=num;++i)
ans=(ans+exlucas(n,m,PK[i],PI[i]))%p;
return ans;
} int main()
{
freopen("equation.in","r",stdin);
freopen("equation.out","w",stdout);
int T;
read(T); read(p);
pre();
int n,n1,n2,m;
int mm,t;
LL ans=;
while(T--)
{
read(n); read(n1); read(n2); read(m);
for(int i=;i<=n1;++i) read(up[i]);
for(int i=;i<=n2;++i) read(down[i]);
for(int i=;i<=n2;++i) m-=down[i]-;
ans=;
for(int i=;i<(<<n1);++i)
{
mm=m;
t=;
for(int j=;j<=n1;++j)
if(i&(<<j-)) mm-=up[j],++t;
t=(t&) ? - : ;
ans=(ans+t*get_C(mm-,n-)+p)%p;
}
cout<<ans<<'\n';
}
}

3129: [Sdoi2013]方程

Time Limit: 30 Sec  Memory Limit: 256 MB
Submit: 646  Solved: 375
[Submit][Status][Discuss]

Description

给定方程
    X1+X2+. +Xn=M
我们对第l..N1个变量进行一些限制:
Xl < = A
X2 < = A2
Xn1 < = An1
我们对第n1 + 1..n1+n2个变量进行一些限制:
Xn1+l > = An1+1
Xn1+2 > = An1+2
Xnl+n2 > = Anl+n2
求:在满足这些限制的前提下,该方程正整数解的个数。
答案可能很大,请输出对p取模后的答案,也即答案除以p的余数。

Input

输入含有多组数据,第一行两个正整数T,p。T表示这个测试点内的数据组数,p的含义见题目描述。
    对于每组数据,第一行四个非负整数n,n1,n2,m。
    第二行nl+n2个正整数,表示A1..n1+n2。请注意,如果n1+n2等于0,那么这一行会成为一个空行。

Output

共T行,每行一个正整数表示取模后的答案。

Sample Input

3 10007
3 1 1 6
3 3
3 0 0 5

3 1 1 3
3 3

Sample Output

3
6
0

【样例说明】
对于第一组数据,三组解为(1,3,2),(1,4,1),(2,3,1)
对于第二组数据,六组解为(1,1,3),(1,2,2),(1,3,1),(2,1,2),(2,2,1),(3,1,1)

HINT

n < = 10^9  , n1 < = 8   , n2 < = 8   ,  m < = 10^9  ,p<=437367875

对于l00%的测试数据:  T < = 5,1 < = A1..n1_n2  < = m,n1+n2 < = n

bzoj千题计划267:bzoj3129: [Sdoi2013]方程的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划134:bzoj3124: [Sdoi2013]直径

    http://www.lydsy.com/JudgeOnline/problem.php?id=3124 第一问: dfs1.dfs2 dfs2中记录dis[i]表示点i距离最长链左端点的距离 第二问 ...

  3. bzoj千题计划133:bzoj3130: [Sdoi2013]费用流

    http://www.lydsy.com/JudgeOnline/problem.php?id=3130 第一问就是个最大流 第二问: Bob希望总费用尽量大,那肯定是把所有的花费加到流量最大的那一条 ...

  4. bzoj千题计划268:bzoj3131: [Sdoi2013]淘金

    http://www.lydsy.com/JudgeOnline/problem.php?id=3131 如果已知 s[i]=j 表示有j个<=n数的数码乘积=i 那么就会有 s[a1]*s[a ...

  5. bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器

    http://www.lydsy.com/JudgeOnline/problem.php?id=3122 等比数列求和公式+BSGS #include<map> #include<c ...

  6. bzoj千题计划258:bzoj3123: [Sdoi2013]森林

    http://www.lydsy.com/JudgeOnline/problem.php?id=3123 启发式合并主席树 #include<cmath> #include<cstd ...

  7. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  8. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  9. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

随机推荐

  1. Redis数据备份、安全、管理服务器笔记

    Redis 数据备份与恢复 Redis SAVE 命令用于创建当前数据库的备份. 实例 redis > SAVE OK 恢复数据 如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 ...

  2. ASP.NetCore2.0概览

      微软为了统一微软平台,造就了.netStandard,不管之前的Framework还是最新的.netCore都必须支持.netStandard标准来统一各个平台的开发api. 以下是之前的微软各个 ...

  3. 统计学习方法c++实现之六 支持向量机(SVM)及SMO算法

    前言 支持向量机(SVM)是一种很重要的机器学习分类算法,本身是一种线性分类算法,但是由于加入了核技巧,使得SVM也可以进行非线性数据的分类:SVM本来是一种二分类分类器,但是可以扩展到多分类,本篇不 ...

  4. PAT甲题题解-1007. Maximum Subsequence Sum (25)-求最大子区间和

    题意:给出n个数,求最大连续的子区间和,并且输出该区间的第一个和最后一个数. 如果所有数都小于0,那么则输出0,第一个数和最后一个数. 看数据k的范围,就知道肯定不能两层for循环来求区间和,O(n^ ...

  5. 《Linux内核设计与实现》第18章读书整理

    第十八章.调试 18.1 准备开始 如果bug能重现的话,将会有很大的帮助. 18.2 内核中的bug Bug多种多样,产生的原因可以有无数的原因,表象也变化多端. 从隐藏在源代码中的错误到展现在目击 ...

  6. Daily Scrum - 11/20

    好习惯的养成需要两个星期. ——砖家 今天我们小组又进行了一次愉快的例会,可以看到daily scrum在我们小组已经逐渐变成了每日的好习惯.首先对以下一些团队routine达成了共识: 1.spri ...

  7. (Alpha)Let's-技术文档(技术规格说明书)

    技术规格说明书 抽象 首先,对抽象原则的理解,“抽象”这一概念本身就很抽象.抽象体现的是一种概括能力.我们生活中遇到的很多客体,其在某些方面具备有一些相似甚至相同的性质,以这些特点而非事物本身来认识鉴 ...

  8. ELK Stack (1) —— ELK + Redis安装

    ELK Stack (1) -- ELK + Redis安装 摘要 安装Elasticsearch.Logstash.Kibana与Redis以实现一个日志收集平台 版本 elasticsearch版 ...

  9. jenkins 添加 k8s 云

    同事的jenkins 链接自己的 k8s 总是出问题 给出了资料和服务器 进行处理. 同时给出的参考资料:https://blog.csdn.net/diantun00/article/details ...

  10. 关于PSP(个人软件过程)

    在第一堂课时,杨老师就提到了PSP(个人软件过程),但是我从2016年3月10日才开始进行粗略的PSP时间管理统计,这是长迭代,用老师的话“差评”.然后在2016年3月11日下午的软件项目管理上,老师 ...