BZOJ 3129 SDOI2013 方程
如果没有限制,答案直接用隔板法C(m-1,n-1)
对于>=x的限制,我们直接在对应位置先放上x-1即可,即m=m-(x-1)
对于<=x的限制,由于限制很小我们可以利用容斥原理将它转化为上面的>=x的限制
即减去1个不满足的 加上2个不满足的 减去3个不满足的 ……
之后就是组合数的计算,对于一个非常大的模数,我们可以将它唯一分解,之后CRT还原即可
但是我们有可能不存在逆元,数据范围不允许我们递推计算组合数
我们知道没有逆元当且仅当(a,p)不互素,我们可以将阶乘分成两部分:互素和不互素
互素的部分具有循环节,我们暴力计算循环节之后快速幂即可
不互素的部分我们可以提出他们的gcd出来并记录指数,剩余部分又变成了计算阶乘,递归即可
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std; const int maxn=110;
typedef long long LL;
int T,tot=0;
LL p,n,n1,n2,m;
LL mod[maxn],prime[maxn],a[maxn];
LL Num[maxn];
LL x,y,d;
LL ans; void Get_mod(LL x){
for(int i=2;i*i<=x;++i){
if(x%i==0){
prime[++tot]=i;mod[tot]=1;
while(x%i==0){x/=i;mod[tot]*=i;}
}
}
if(x>1)prime[++tot]=x,mod[tot]=x;
}
void ex_gcd(LL a,LL b,LL &x,LL &y,LL &d){
if(b==0){x=1;y=0;d=a;}
else{ex_gcd(b,a%b,y,x,d);y-=(a/b)*x;}
}
LL pow_mod(LL v,LL p,LL mod){
LL tmp=1;
while(p){
if(p&1)tmp=tmp*v%mod;
v=v*v%mod;p>>=1;
}return tmp;
}
LL inv(LL a,LL b){
ex_gcd(a,b,x,y,d);
return (x%b+b)%b;
}
LL CRT(){
LL ans=0;
for(int i=1;i<=tot;++i){
LL m=p/mod[i];
ex_gcd(mod[i],m,d,y,d);
ans=(ans+y*m*a[i])%p;
}return (ans+p)%p;
}
pair<LL,LL> fac(int k,LL n){
if(n==0)return make_pair(0,1);
int x=n/prime[k],y=n/mod[k];
LL ans=1;
if(y){
for(int i=2;i<mod[k];++i)if(i%prime[k]!=0)ans=(ans*1LL*i)%mod[k];
ans=pow_mod(ans,y,mod[k]);
}
for(int i=y*mod[k]+1;i<=n;++i)if(i%prime[k]!=0)ans=(ans*1LL*i)%mod[k];
pair<LL,LL> tmp=fac(k,x);
return make_pair(x+tmp.first,ans*tmp.second%mod[k]);
}
LL cal(int k,LL n,LL m){
if(n<m)return 0;
pair<LL,LL> a=fac(k,n),b=fac(k,m),c=fac(k,n-m);
return pow_mod(prime[k],a.first-b.first-c.first,mod[k])*a.second%mod[k]
*inv(b.second,mod[k])%mod[k]*inv(c.second,mod[k])%mod[k];
}
LL C(LL n,LL m){
for(int i=1;i<=tot;++i)a[i]=cal(i,n,m);
return CRT();
}
void DFS(int pos,int now,LL sum){
if(pos>n1){
if(now)ans-=C(m-1-sum,n-1);
else ans+=C(m-1-sum,n-1);
ans=(ans+p)%p;
return;
}
DFS(pos+1,now,sum);
DFS(pos+1,now^1,sum+Num[pos]);
} int main(){
scanf("%d%lld",&T,&p);
Get_mod(p);
while(T--){
scanf("%lld%lld%lld%lld",&n,&n1,&n2,&m);
for(int i=1;i<=n1;++i)scanf("%lld",&Num[i]);
for(int i=1;i<=n2;++i){scanf("%lld",&x);m=m-x+1;}
ans=0;
DFS(1,0,0);
printf("%lld\n",(ans+p)%p);
}return 0;
}
BZOJ 3129 SDOI2013 方程的更多相关文章
- [BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】
题目链接:BZOJ - 3129 题目分析 使用隔板法的思想,如果没有任何限制条件,那么方案数就是 C(m - 1, n - 1). 如果有一个限制条件是 xi >= Ai ,那么我们就可以将 ...
- ●BZOJ 3129 [Sdoi2013]方程
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3129 题解: 容斥,扩展Lucas,中国剩余定理 先看看不管限制,只需要每个位置都是正整数时 ...
- 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千题计划267:bzoj3129: [Sdoi2013]方程
http://www.lydsy.com/JudgeOnline/problem.php?id=3129 如果没有Ai的限制,就是隔板法,C(m-1,n-1) >=Ai 的限制:m减去Ai &l ...
- bzoj3129[Sdoi2013]方程 exlucas+容斥原理
3129: [Sdoi2013]方程 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 582 Solved: 338[Submit][Status][ ...
- 【BZOJ3129】[SDOI2013]方程(容斥,拓展卢卡斯定理)
[BZOJ3129][SDOI2013]方程(容斥,拓展卢卡斯定理) 题面 BZOJ 洛谷 题解 因为答案是正整数,所先给每个位置都放一个就行了,然后\(A\)都要减一. 大于的限制和没有的区别不大, ...
- BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理
BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理 Description 给定方程 X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A ...
- bzoj 3129
非常好的一道数学题,考察了大量数论和组合数学的知识 在做本题之前强烈建议先完成下列两个背景知识: ①: bzoj 2142礼物 因为本题的一部分数据需要利用到拓展卢卡斯定理,而礼物是拓展卢卡斯定理的裸 ...
- [BZOJ 3198] [Sdoi2013] spring 【容斥 + Hash】
题目链接:BZOJ - 3198 题目分析 题目要求求出有多少对泉有恰好 k 个值相等. 我们用容斥来做. 枚举 2^6 种状态,某一位是 1 表示这一位相同,那么假设 1 的个数为 x . 答案就是 ...
随机推荐
- WP开发笔记——WP7 SDK使用技巧
俗话说的好,工欲善其事,必先利其器. 入门WP开发之前,免不了要先接触开发环境和开发工具.使用WP7 SDK进行开发,我们需要掌握SDK的一些实用技巧,以便我们的开发. 一.开启/关闭电脑键盘输入 W ...
- Linux C 程序 进程控制(17)
进程控制 1.进程概述现代操作系统的特点在于程序的并行执行.Linux是一个多用户多任务的操作系统.ps .pstree 查看进程进程除了进程id外还有一些其他标识信息,可以通过相应的函数获得.// ...
- eclipse,myeclipse svn 和jadclipse 反编译插件 及安装
插件下载链接:http://download.csdn.net/download/mmyzlinyingjie/6456785 myeclipse svn 安装: 把svn解压,然后把这个文件夹放在m ...
- Win7构造wifi热点【Written By KillerLegend】
1:Win+R打开DOS,输入以下命令然后回车,不要关闭该DOS窗口: netsh wlan set hostednetwork mode = allow ssid =你的wifi热点名字 key ...
- MongoDB Long/Int(长整型)的自增长主键 解决方案
今朝有幸尝芒果,发现自增长ID类型有多种,唯独没有Long/Int. 一思路:1. 自建一个Collection(表,假设名为:IdentityEntity,其中字段:_id, Key, Value, ...
- allegro生成光绘文件时,通过cam打开,*.drl钻孔文件不识别,为Unknow类型
生成钻孔文件时,NC_Parameters中,应该选Absolute
- PAT 字符串-02 删除字符串中的子串
/* 2 *PAT 字符串-02 删除字符串中的子串 3 *2015-08-09 4 作者:flx413 5 */ #include<stdio.h> #include<string ...
- 增强的PuTTY 以及 自定义主题
PuTTY很早之前就没有更新了(0.62),因为都是开源的所以有人branch出来做了增强,如这个PuTTY tray,增加了超链等功能: https://puttytray.goeswhere.co ...
- 指向const的指针和const指针
1.指向const的指针:const int *p 或 int const *p 解释:p是一个指针,指向const int类型的常量:指针指向的内容为常量,因此不能改变*p的值,但指针p可以改变,指 ...
- 分类图 Class Diagram
类图(Class Diagram)是描述类.接口.协作以及它们之间关系的图. 类图是系统中静态视图的一部分,静态视图可以包括许多的类图. 静态视图用于为软件系统进行结构建模,它构造系统的词汇和关系,而 ...