[SDOI2013]方程
。。。最近考了一道数学题。是典型的隔板问题。
P.S.最近八中oj上面没有系统地刷过题
题面可以直接转化为m个球分到n个箱子,每个箱子至少放1个,前n1个箱子的球数必须满足全部小于等于A[i],接着n2个必须大于等于A[i],剩下随意,问方案。
在没有约束时,答案自然是C(M-1,N-1),这个用插板法很好想>0<
考虑第二种约束,我们只要先提前在篮子里钦定A[i]-1个球,那么剩下随便放就一定能满足了。
对付第一种约束,我们用容斥原理来实现。所有方案数-至少有一个错误+至少两个错误-至少三个错误······
设w(k)为至少前面有k个篮子产生错误的方案数,我们可以在对应错误箱子放A[i]个,进行插板。这个dfs一下就ok了,因为n1,n2非常小!!!
但是n,m可以很大,p也不是质数所以用不了Lucas。所以可以用组合数模。
但是我不会。。要用到很多奇怪的定理比如说中国剩余定理。
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
ll f[],a[],b[],c[],d[],e[],pri[+],fac[+];
+];
ll cnt,t,x,y,top,tot,n1,n,m,n2,p,pp,ans;
ll quickmi(ll x,ll y,ll p)
{
);)return x%p;
ll tmp=,a=x;
)
{
==){tmp=tmp*a%p;} a=a*a%p;y/=;
} return tmp;
}
ll gcd(ll a,ll b,ll &x,ll &y){
){
x=;y=;return a;
}else{
ll tmp=gcd(b,a%b,x,y);
ll t=x;x=y;y=t-a/b*y;return tmp;
}
}
ll calcfac(ll n,ll p,ll pp){
if (n<pp) return fac[n];
ll t=quickmi(fac[p-],n/p,p);
t=t*fac[n%p]%p;
cnt+=n/pp;
t=t*calcfac(n/pp,p,pp)%p;
return t;
}
ll getni(ll xx,ll yy){//exgcdÇóxx¹ØÓÚyyµÄÄæÔª
ll tmp=gcd(xx,yy,x,y);
return (x%yy+yy)%yy;
}
ll calc(ll x,ll y,ll p,ll pp)
{
fac[]=;
;i<=p-;i++)
)fac[i]=fac[i-];]*i%p;
cnt=;
ll A=calcfac(y,p,pp);ll tot=cnt;cnt=;
ll B=calcfac(x,p,pp);B=B*calcfac(y-x,p,pp)%p;
B=getni(B,p);
return A*B%p*quickmi(pp,tot-cnt,p)%p;
}
ll comb(ll x,ll y,ll p){
;
;i<=top;i++)a[i]=calc(x,y,d[i],e[i]);
;i<=top;i++)b[i]=getni(c[i],d[i]);
ll t=;
;i<=top;i++)t=(t+a[i]*b[i]%p*c[i]%p)%p;
return t;
}
void dfs(ll id,ll m,ll cnt){
){
ll t=comb(n-,m-,p);
//printf("<>==%lld %lld %lld\n",m,n,t);
==)ans=(ans-t+p)%p;else ans=(ans+t)%p;
return;
}
dfs(id+,m,cnt);
,m-f[id],cnt+);
}
int main()
{
int cas;
scanf("%d%lld",&cas,&p);
;i<=;i++)
{
)tot++,pri[tot]=i;
;j<=tot;j++){
)break;
flag[pri[j]*i]=;
)break;
}
}
pp=p; top=;
;i<=tot;i++){
){
top++;d[top]=;e[top]=pri[i];
){
d[top]*=pri[i];
pp/=pri[i];
}
}
}
;i<=top;i++)c[i]=p/d[i];
while(cas--)
{
scanf("%lld%lld%lld%lld",&n,&n1,&n2,&m);
;i<=n1;i++)scanf("%lld",&f[i]);
;i<=n2;i++){
ll x;scanf("%lld",&x);
)m-=x-;
}
if(m<n1){
printf("0\n");continue;
}
ans=;
dfs(,m,);
printf("%lld\n",ans);
}
}
bzoj3129
[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} ...
- 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 ...
随机推荐
- <<< 将一个rar格式的文件变成一张jpg图片,按照后缀来选择打开他的模式
把一个压缩格式和一张图片合成,按照后缀来判断他打开是图片还是解压文件,后缀是jpg打开的就是一张图片,后缀是rar打开的就是一个压缩包,里面存放你放的东西 :例如(秘密) 准备一张图片,test. ...
- ElasticSearch-5.0.0安装中文分词插件IK
Install IK 源码地址:https://github.com/medcl/elasticsearch-analysis-ik,git clone下来. 1.compile mvn packag ...
- 11月13日上午ajax返回数据类型为JSON数据的处理
ajax返回数据类型为JSON数据的处理 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...
- Python学习笔记——集合类型
集合类型有两种不同的类型——可变集合(set)和不可变集合(frozenset) 可变集合不是可哈希的,不能用作字典的键,也不能用做其他集合中的元素 不可变集合是有哈希值的,能被用做字典的键或者是作为 ...
- 什么?你还不会写JQuery 插件
前言 如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jquery 及ui 内置web项目里了.至于使用jquery好处这里就不再赘述了,用过的都知道.今天我们来讨论 ...
- 数据存储_ SQLite(3)
SQLite的应用 一.简单说明 1.在iOS中使用SQLite3,首先要添加库文件 libsqlite3.dylib 2.导入主头文件 #import <sqlite3.h> 二.具体说 ...
- bzoj1003 物流运输
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
- Java 23种设计模式 (通俗易懂解释收集整理)
(补充中...) P02 抽象工程模式 P14 TemplateMethod 模板方法模式 讲清楚了为什么叫做模板方法 http://www.cnblogs.com/java-my-life/arc ...
- php时区问题
今天遇到一个很诡异的问题: 数据库中存的日期信息为时间戳,用php取出数据库中的日期信息,并用date()函数转化为“Y-m-d”后,发现和mysql格式化函数Date_Format()处理后的结果不 ...
- Mac键盘图标与对应快捷按键标志汇总
Mac键盘图标与对应快捷按键 ⌘--Command () win键 ⌃ --Control ctrl键 ⌥--Option (alt) ⇧--Shift ⇪--Caps Lock fn--功能键就是 ...