拓展Lucas+容斥原理

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#define MAXN 10000+10
#define INF 0x7f7f7f7f
#define LINF 0x7f7f7f7f7f7f7f7f
#define ll long long
#define pb push_back
#define ft first
#define sc second
#define mp make_pair
#define pil pair<int,ll>
#define pll pair<ll,ll>
using namespace std;
struct Lucas{
void extgcd(ll a,ll b,ll &x,ll &y){
if(!b){x=,y=;}
else{
ll xx,yy;
extgcd(b,a%b,xx,yy);
x=yy;
y=xx-a/b*yy;
}
}
ll Inv(ll a,ll b){
ll x,y;
extgcd(a,b,x,y);
x=(x%b+b)%b;
if(!x)x+=b;
return x;
}
ll Pow(ll a,ll b,ll p){
ll ret=1LL;
while(b){
if(b&){(ret*=a)%=p;}
(a*=a)%=p;
b>>=;
}
return ret;
}
ll fac(ll n,ll pi,ll pk){
if(!n)return 1LL;
ll ret=1LL;
for(ll i=;i<pk;i++){
if(i%pi)(ret*=i)%=pk;
}
ret=Pow(ret,n/pk,pk);
for(ll i=;i<=(n%pk);i++){
if(i%pi)(ret*=i)%=pk;
}
return ret*fac(n/pi,pi,pk)%pk;
}
ll C(ll n,ll m,ll pi,ll pk){
ll a=fac(n,pi,pk),b=fac(m,pi,pk),c=fac(n-m,pi,pk);
ll t=0LL;
for(ll i=n/pi;i;i/=pi)t+=i;
for(ll i=m/pi;i;i/=pi)t-=i;
for(ll i=(n-m)/pi;i;i/=pi)t-=i;
ll ret=a*Inv(b,pk)*Inv(c,pk)%pk;
(ret*=Pow(pi,t,pk))%=pk;
return ret;
}
ll n,m,p;
vector<pll> pn;
ll init(ll pp){
p=pp;
ll x=sqrt(pp*1.0);
for(ll i=;i<=x;i++){
if(pp%i==){
ll pk=1LL;
while(pp%i==){
pp/=i;
pk*=i;
}
pn.pb(mp(i,pk));
}
}
if(pp^){
pn.pb(mp(pp,pp));
}
}
ll solve(ll n,ll m){
ll ans=0LL,pi,pk;
for(int i=;i<pn.size();i++){
pi=pn[i].ft,pk=pn[i].sc;
ll t=C(n,m,pi,pk);
(t*=(p/pk))%=p;
(t*=Inv(p/pk,pk))%=p;
(ans+=t)%=p;
}
return ans;
}
}L;
int T,n,n1,n2,m;
int a[];
ll ans,p;
ll calc(ll n,ll m){
return L.solve(m+n-,min(m,n-));
}
void rc(int k,int m,int f){
if(m<)return;
ans+=f*calc(n,m);
ans=(ans%p+p)%p;
for(int i=k+;i<=n1;i++){
rc(i,m-a[i],-f);
}
}
void solve(){
scanf("%d%d%d%d",&n,&n1,&n2,&m);
m-=n;
for(int i=;i<=n1;i++){
scanf("%d",&a[i]);
}
int t;
for(int i=;i<=n2;i++){
scanf("%d",&t);
m-=(t-);
}
if(m<){
printf("0\n");
return;
}
ans=0LL;
rc(,m,);
printf("%lld\n",ans);
}
int main()
{
//freopen("data.in","r",stdin);
scanf("%d%lld",&T,&p);
L.init(p);
while(T--){
solve();
}
return ;
}

BZOJ3129: [Sdoi2013]方程的更多相关文章

  1. bzoj3129[Sdoi2013]方程 exlucas+容斥原理

    3129: [Sdoi2013]方程 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 582  Solved: 338[Submit][Status][ ...

  2. bzoj千题计划267:bzoj3129: [Sdoi2013]方程

    http://www.lydsy.com/JudgeOnline/problem.php?id=3129 如果没有Ai的限制,就是隔板法,C(m-1,n-1) >=Ai 的限制:m减去Ai &l ...

  3. BZOJ3129 SDOI2013方程(容斥原理+扩展lucas)

    没有限制的话算一个组合数就好了.对于不小于某个数的限制可以直接减掉,而不大于某个数的限制很容易想到容斥,枚举哪些超过限制即可. 一般情况下n.m.p都是1e9级别的组合数没办法算.不过可以发现模数已经 ...

  4. BZOJ3129 [Sdoi2013]方程 【扩展Lucas】

    题目 给定方程 X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A X2 < = A2 Xn1 < = An1 我们对第n1 + 1..n1+n2个 ...

  5. 【BZOJ3129】[SDOI2013]方程(容斥,拓展卢卡斯定理)

    [BZOJ3129][SDOI2013]方程(容斥,拓展卢卡斯定理) 题面 BZOJ 洛谷 题解 因为答案是正整数,所先给每个位置都放一个就行了,然后\(A\)都要减一. 大于的限制和没有的区别不大, ...

  6. BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理

    BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理 Description 给定方程     X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A ...

  7. [SDOI2013]方程

    ...最近考了一道数学题.是典型的隔板问题. P.S.最近八中oj上面没有系统地刷过题 题面可以直接转化为m个球分到n个箱子,每个箱子至少放1个,前n1个箱子的球数必须满足全部小于等于A[i],接着n ...

  8. [BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】

    题目链接:BZOJ - 3129 题目分析 使用隔板法的思想,如果没有任何限制条件,那么方案数就是 C(m - 1, n - 1). 如果有一个限制条件是 xi >= Ai ,那么我们就可以将 ...

  9. 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} ...

随机推荐

  1. beta冲刺 用户使用调查报告

    测评结果 一.使用体验 数据加载响应很快,页面切换丝滑流畅. UI有点偏暗,有些字被覆盖了. 页面布局过于居中,两侧空白范围较大. 总体功能完善. 二.登录.注册.忘记密码界面 管理员登录按钮太靠下, ...

  2. scrapy 修改URL爬取起始位置

    import scrapy from Autopjt.items import myItem from scrapy.http import Request class AutospdSpider(s ...

  3. a标签传递参数

    a标签传递参数 单个参数:参数名称前面跟   ? <a href="localhost:8080/arguments?id=1">单个参数</a> 多个参数 ...

  4. Mongodb 3 查询优化(慢查询Profiling)

    开启慢查询Profiling Profiling级别说明 0:关闭,不收集任何数据. 1:收集慢查询数据,默认是100毫秒. 2:收集所有数据 1.通过修改配置文件开启Profiling 修改启动mo ...

  5. thinkphp后台向前台传值没有传过去的小问题

    if($listyyarr){ $this->assign('listyyarr',$listyyarr); //$this->assign('nowDated',$endDated); ...

  6. LeetCode & Q169-Majority Element-Easy

    Array Divide and Conquer Bit Manipulation Description: Given an array of size n, find the majority e ...

  7. Java KeyTool command

    Create a new key: keytool -genkey -alias keyAlias -keyalg RSA  -validity 1000 -keystore d:\keyPath\k ...

  8. 使用 vi 命令

    一.vi是什么 vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器. Linux中的vi编辑器叫vim,它是vi的增强版(vi Improved),与vi编辑器完全兼容,而且实 ...

  9. OrientDB入门(1)Getting Started

    Running OrientDB the First Time First, download and extract OrientDB by selecting the appropriate pa ...

  10. spring cloud zipkin sleuth与spring boot aop结合后,启动慢

    问题描述: 引入了spring cloud的监控starter,间接引入jooq. 又引入了 spring-boot-starter-web,所以间接引入aop. 参考下面资料后:https://gi ...