[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 ...
随机推荐
- mysql免安装使用(win7 64位系统)
一.解压 二.以管理员身份运行cmd 三.cmd命令进入到解压后的mysql文件bin目录下 四.将mysql服务添加到windows服务中.cmd在bin目录下输入:mysqld -install ...
- <<< eclipse软件部署修改项目的访问地址
在eclipse开发javaweb项目的时候,访问项目时需要在浏览器地址输入:localhost:8080/项目名 但是大多数部署到服务器的时候访问的是根目录,就是不加localhost:8080后 ...
- vim编辑器的使用
I 在光标所在行的行首插入 A 在光标所在行的行尾插入 { 移动到上一段 } 移动到下一段 空格向后移动一格 H 屏幕顶部 M 屏幕中间 L 屏幕下方 n| 使光标移动到第几个字符处 ngg 移动到制 ...
- ToString和Convert.ToString处理null值
http://www.cnblogs.com/qinge/p/5687806.html文章来源 1.Convert.ToString能处理字符串为null的情况. 测试代码如下: 1 2 3 4 5 ...
- arguments
arguments 转数组 通常使用下面的方法来将 arguments 转换成数组: Array.prototype.slice.call(arguments); 还有一个更简短的写法: [].sli ...
- HTML a标签、4个伪类、常用属性(下载)、锚链接(待扩展:邮件、电话、短信、GPS)
HTML 超链接<a> 1.超链接可以是一个字.一个词.一组词.一幅图像,您可以点击这些内容来跳转到新的文档或者当前文档中的某个部分. 2.当您把鼠标指针移动到网页中的某个链接上时,箭头会 ...
- 启动网卡报:Device eth0 does not seem to be present”解决办法
Device eth0 does not seem to be present”解决办法 : 用ifconfig查看发现缺少eth0,只有lo:用ifconfig -a查看发现多出了eth1的信息. ...
- 数据存储_ SQLite(3)
SQLite的应用 一.简单说明 1.在iOS中使用SQLite3,首先要添加库文件 libsqlite3.dylib 2.导入主头文件 #import <sqlite3.h> 二.具体说 ...
- CSS隐藏多余文字的几个方法
通常偏移掉字体的方式是 (1)使用text-indent:-9999px; 可是他有一个局限性 他只适用于块级元素block而我们往往有时候想偏移掉的a上的字体所以问题就来了text-indent:- ...
- Android联系人数据库
转载自http://www.2cto.com/kf/201406/309356.html 通信录是一个3层的数据存储模型,这三个数据模型就是ContactsContact.Data,ContactsC ...