【JZOJ3214】【SDOI2013】方程
╰( ̄▽ ̄)╭
给定方程
X1+X 2+…+Xn=m
我们对第 1.. n1 个变量 进行一些限制 :
X1≤A1
X2≤A2
…
Xn1 ≤An1
我们对第 n1+1.. n1+1.. n1+ n2 个变量 进行一些限制 :
X_(n1+1)≥A_(n1+1)
X_(n1+2)≥A_(n1+2)
…
X_(n1+n2) ≥A_(n1+n2)
求:在满足这些限制的前提下, 该方程正整数解的个数。
答案可能很大,请输出对 p取模 后的答案 ,也即 答案除以 p的余数。
(⊙ ▽ ⊙)
利用容斥原理,可以将所有要满足的条件一转化为条件二。
而条件二可以利用隔板法,Ans=Cn−1m−1−∑xi。
但是,本道题的最大Trick是组合数取模:Lucas定理+中国剩余定理
两个定理
中国剩余定理
内容:
设a1,a2,a3...ak两两互质,且一个数X mod这些数,分别得到m1,m2,m3...,mk。
设Mj=∏ni=1mi(i!=j),
则X=∏ni=1ai∗Mi∗M−1i。
Lucas定理
内容:
举个例子,比如说要算19! mod 32。
19!=1∗2∗3∗4∗...∗19
把所有3的倍数提取出来:
19!=(1∗2∗4∗5∗7∗8∗10∗11∗13∗14∗16∗17∗19)∗36∗(1∗2∗3∗4∗5∗6)
很显然,(1∗2∗3∗4∗5∗6)可以利用相同的办法算出,
(1∗2∗4∗5∗7∗8∗10∗11∗13∗14∗16∗17∗19)则可以发现,
每32属于一个循环节,于是可以使用快速幂优化。
为了可以使用中国剩余定理,
我们先对题目所给的模数p分解质因数,得∏pkii。
对于Cmn,要对p取模;
就让它先对每个pkii取模,这样就可以使用中国剩余定理。
问题又变成:Cmn对pk取模了,
Cmn=n!m!(n−m!),
所以可以对n!,m!,(n−m)!分别使用Lucas定理:
n!⇒t1∗pu1
m!⇒t2∗pu2
(n−m)!⇒t3∗pu3;
最后,模出来的数即为pu1−u2−u3∗t1∗t2−1∗t3−1。
( ̄~ ̄)
#include<stdio.h>
#define ll long long
using namespace std;
const ll maxn=110000;
ll t,n,m,n1,n2,mo,i,j,k;
ll a[maxn],ans,p[maxn],pp[maxn],P[maxn];
ll ch[maxn],fac[maxn];
ll qpower(ll a,ll b,ll mo){
ll c=1;
while (b){
if (b&1) c=a*c%mo;
a=a*a%mo;
b>>=1;
}
return c;
}
ll exgcd(ll a,ll b,ll &x,ll &y){
if (b==0){
x=1;
y=0;
return a;
}
ll r=exgcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-a/b*y;
return r;
}
ll ni(ll v,ll mo){
ll x,y;
exgcd(v,mo,x,y);
return (x%mo+mo)%mo;
}
ll L;
void lucas(ll n,ll p,ll P,ll &tmp,ll &u){
if (n==0) return ;
ll i,k=n/P,l=1;
u+=n/p;
if (k){
l=qpower(L,k,P);
}//循环节计算
tmp=tmp*l%P;
for (i=k*P+1;i<=n;i++) if (i%p) tmp=tmp*i%P;//计算剩余部分
lucas(n/p,p,P,tmp,u);
}
ll count(ll m,ll n,ll p,ll P){
ll t1=1,t2=1,t3=1,u1=0,u2=0,u3=0;
L=1;
for (int i=1;i<=P;i++) if (i%p) L=L*i%P;
lucas(n,p,P,t1,u1);
lucas(m,p,P,t2,u2);
lucas(n-m,p,P,t3,u3);
return qpower(p,u1-u2-u3,P)*t1%P*ni(t2,P)%P*ni(t3,P)%P;
}
ll china(){
ll i,j=0;
for (i=1;i<=p[0];i++){
ll tmp=mo/P[i];
j=(j+ch[i]*ni(tmp,P[i])*tmp)%mo;
}
return (j%mo+mo)%mo;
}
ll c(ll up,ll down){
ll i,j,k;
if (up>down) return 0;
for (i=1;i<=p[0];i++) ch[i]=count(up,down,p[i],P[i]);
return china();
}
void solve(ll v,ll l,ll num){
ll i,j,k;
if (l>n1){
ans=(ans+c(n-1,v-1)*(num&1?-1:1))%mo;
return;
}
if (v-a[l]>0) solve(v-(a[l]),l+1,num+1);
solve(v,l+1,num);
}
void init(){
ll i,j,k=mo;
for (i=2;i*i<=k;i++){
if (k%i==0){
p[++p[0]]=i;
P[p[0]]=1;
while (k%i==0){
k/=i;
pp[p[0]]++;
P[p[0]]*=i;
}
}
}
if (k>1){
p[++p[0]]=k;
pp[p[0]]=1;
P[p[0]]=k;
}
}
int main(){
scanf("%lld%lld",&t,&mo);
init();
while (t--){
scanf("%lld%lld%lld%lld",&n,&n1,&n2,&m);
ans=0;
for (i=1;i<=n1;i++) scanf("%d",&a[i]);
for (i=1;i<=n2;i++) scanf("%d",&j),m-=j-1;
solve(m,1,0);
ans=(ans%mo+mo)%mo;
printf("%lld\n",ans);
}
}
(⊙v⊙)
1.使用Lucas定理时,可以预处理阶乘;
2.使用Lucas定理时,要另开变量存储循环节的快速幂。
【JZOJ3214】【SDOI2013】方程的更多相关文章
- bzoj3129[Sdoi2013]方程 exlucas+容斥原理
3129: [Sdoi2013]方程 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 582 Solved: 338[Submit][Status][ ...
- BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理
BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理 Description 给定方程 X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A ...
- 【BZOJ3129】[SDOI2013]方程(容斥,拓展卢卡斯定理)
[BZOJ3129][SDOI2013]方程(容斥,拓展卢卡斯定理) 题面 BZOJ 洛谷 题解 因为答案是正整数,所先给每个位置都放一个就行了,然后\(A\)都要减一. 大于的限制和没有的区别不大, ...
- bzoj千题计划267:bzoj3129: [Sdoi2013]方程
http://www.lydsy.com/JudgeOnline/problem.php?id=3129 如果没有Ai的限制,就是隔板法,C(m-1,n-1) >=Ai 的限制:m减去Ai &l ...
- [BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】
题目链接:BZOJ - 3129 题目分析 使用隔板法的思想,如果没有任何限制条件,那么方案数就是 C(m - 1, n - 1). 如果有一个限制条件是 xi >= Ai ,那么我们就可以将 ...
- BZOJ3129 [Sdoi2013]方程 【扩展Lucas】
题目 给定方程 X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A X2 < = A2 Xn1 < = An1 我们对第n1 + 1..n1+n2个 ...
- 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} ...
- [SDOI2013]方程
...最近考了一道数学题.是典型的隔板问题. P.S.最近八中oj上面没有系统地刷过题 题面可以直接转化为m个球分到n个箱子,每个箱子至少放1个,前n1个箱子的球数必须满足全部小于等于A[i],接着n ...
- BZOJ 3129 SDOI2013 方程
如果没有限制,答案直接用隔板法C(m-1,n-1) 对于>=x的限制,我们直接在对应位置先放上x-1即可,即m=m-(x-1) 对于<=x的限制,由于限制很小我们可以利用容斥原理将它转化为 ...
- BZOJ3129: [Sdoi2013]方程
拓展Lucas+容斥原理 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cs ...
随机推荐
- 05_Hibernate数据库连接池
一.配置连接池 连接池:连接池是创建和管理数据库连接的缓冲池技术. 优点:合理利用数据库连接资源.简化的编程模式.受控的资源使用. 主流连接池: DBCP(DataBase connection po ...
- Linux常见问题解答--如何修复“tar:Exiting with failure status due to previous errors”
问题: 当我用tar命令来创建一个压缩文件时,总在执行过程中失败,并且抛出一个错误说明"tar:由于前一个错误导致失败退出"("Exiting with failure ...
- python configparser模块详解
此模块提供了一个实现基本配置语言的类 首先来看一个非常基本的配置文件,如下所示格式: [DEFAULT] ServerAliveInterval = 45 Compression = yes Comp ...
- 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
导语 发布app后,开发者最头疼的问题就是如何解决交付后的用户侧问题的还原和定位,是业界缺乏一整套系统的解决方案的空白领域,闲鱼技术团队结合自己业务痛点在flutter上提出一套全新的技术思路解决这个 ...
- 【ZJOI2007】【BZOJ1059】矩阵游戏 匈牙利算法
题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换 ...
- java 在线拆分 word文档采用什么技术比较好?
在Java项目开发中,偶尔会遇到通过程序动态拆分word文档的需求,由于Java本身不能操作Word文档,在网上也都是讨论如何动态合并word,所以这个需求实现起来相当困难,下面就将近期对于Word文 ...
- com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据。
遇到这个错误 数据库表结构定义为:varchar(50) 实际插入数据的字符长度超过了50,会引发这种错误. 如果你是debug调试的. 或许你在 getSession().flush(); 上报 ...
- Hibernate-概述-搭建-测试-配置详解
一 hibernate概述 1.1 框架是什么 1.框架是用来提高开发效率的 2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现. 3.所以框架可以理解成是一个半成品的项目.只 ...
- Hadoop 单机安装配置
- DevCloud会员权益升级!日常领码豆,轻松换好礼!
为了回馈每一位用户的使用和支持, 华为云DevCloud上线了会员中心, 大家在会员中心可以通过完成任务赚取码豆, 并在兑换商城兑换精美礼品. 如何通过任务获得码豆? 我们为大家准备了各种日常任务, ...