P3301 [SDOI2013]方程
思路
容斥的挺好的练习题
对于第二个条件,可以直接使m减去suma2,使得第二个条件舍去,然后m再减去n,使得问题转化成有n1个变量要满足小于等于某个数的条件,其他的随便取,求整数解的个数
对n1,以2^n的复杂度枚举至少哪些不符合限制,然后容斥(至少0个-至少1个+至少2个....)
然后用隔板法可以得到每一次答案为
\]
注意本题模数不是质数,需要EXLucas,同时由于本题卡时间,所以要预处理MOD的质因数和mul函数要用的阶乘
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
int pow(int a,int b,int MOD){
    int ans=1;
    while(b){
        if(b&1)
            ans=(1LL*ans*a)%MOD;
        a=(1LL*a*a)%MOD;
        b>>=1;
    }
    return ans;
}
int exgcd(int a,int b,int &x,int &y){
    if(b==0){
        x=1;
        y=0;
        return a;
    }
    int req=exgcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-a/b*y;
    return req;
}
int inv(int a,int p){
    if(!a)
        return 0;
    int x,y;
    exgcd(a,p,x,y);
    x=((x%p+p)%p);
    if(!x)
        x+=p;
    return x;
}
int f[10210];
int mul(int n,int pi,int pk){//get n!/pi^a%p^k
    if(n<pi)
        return f[n];
    return 1LL*pow(f[pk-1],n/pk,pk)*f[n%pk]%pk*mul(n/pi,pi,pk)%pk;
}
int C(int n,int m,int Mod,int pi,int pk){
    if(m>n)
        return 0;
    f[0]=1;
    for(int i=1;i<=pk;i++)
        if(i%pi)
            f[i]=(f[i-1]*i)%pk;
        else
            f[i]=f[i-1];
    int jcn=mul(n,pi,pk),jcm=mul(m,pi,pk),jcnm=mul(n-m,pi,pk),k=0;
    for(int i=n;i;i/=pi)
        k+=i/pi;
    for(int i=m;i;i/=pi)
        k-=i/pi;
    for(int i=n-m;i;i/=pi)
        k-=i/pi;
    int ans=1LL*jcn*inv(jcm,pk)%pk*inv(jcnm,pk)%pk*pow(pi,k,pk)%pk;
    return 1LL*ans*(Mod/pk)%Mod*inv(Mod/pk,pk)%Mod;
}
int exLucas(int n,int m,int Mod){
    int ans=0;
    if(Mod==10007){
        ans=(ans+C(n,m,Mod,10007,10007))%Mod;
    }
    else if(Mod==262203414){
        ans=(ans+C(n,m,Mod,2,2)%Mod+C(n,m,Mod,3,3)%Mod+C(n,m,Mod,11,11)%Mod+C(n,m,Mod,397,397)%Mod+C(n,m,Mod,10007,10007)%Mod)%Mod;
    }
    else{
        ans=(ans+C(n,m,Mod,5,125)+C(n,m,Mod,7,343)+C(n,m,Mod,101,10201))%Mod;
    }
    return ans;
}
int n,n1,n2,m,A[20],MOD,ans,T,sum2;
int bitcount(int x){
    int ans=0;
    while(x){
        ans++;
        x&=(x-1);
    }
    return ans;
}
int bi[(1<<9)];
signed main(){
    scanf("%lld %lld",&T,&MOD);
    for(int i=0;i<(1<<8);i++)
        bi[i]=bitcount(i);
    while(T--){
        memset(A,0,sizeof(A));
        ans=0;
        sum2=0;
        scanf("%lld %lld %lld %lld",&n,&n1,&n2,&m);
        for(int i=1;i<=n1+n2;i++){
            scanf("%lld",&A[i]);
            if(i>n1)
                sum2+=A[i]-1;
        }
        m-=sum2;
        for(int i=0;i<(1<<(n1));i++){
            int midt=0,midcnt=0;
            for(int j=1;j<=n1;j++)
                if((i>>(j-1))&1)
                    midt+=A[j],midcnt++;
            ans=(ans+(1LL*((bi[i]&1)?-1:1)*exLucas(m-midt-1,n-1,MOD)%MOD+MOD))%MOD;
        }
        printf("%lld\n",ans);
    }
    return 0;
}
P3301 [SDOI2013]方程的更多相关文章
- 洛谷P3301 [SDOI2013]方程(扩展Lucas+组合计数)
		题面 传送门 题解 为啥全世界除了我都会\(exLucas\)啊--然而我连中国剩余定理都不会orz 不知道\(exLucas\)是什么的可以去看看yx巨巨的这篇博客->这里 好了现在我们就解决 ... 
- 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 ... 
随机推荐
- Unknown Treasure (卢卡斯 + 孙子定理, 模板题)
			Unknown Treasure 参考链接 : https://www.cnblogs.com/linyujun/p/5199684.html 卢卡斯定理 : C(n, m) % p = C(n ... 
- GCD (RMQ + 二分)
			RMQ存的是区间GCD,然后遍历 i: 1->n, 然后不断地对[i, R]区间进行二分求以i为起点的相同gcd的区间范围,慢慢缩减区间. #include<bits/stdc++.h&g ... 
- 【Redis学习之六】Redis数据类型:集合和有序集合
			环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-2.8.18 一.集合 Set无序的.去重的元素 ... 
- ActiveMQ任意文件写入漏洞(版本在5.12.X前CVE-2016-3088)
			ActiveMQ任意文件写入漏洞(版本在5.12.X前CVE-2016-3088) 查看docker的activemq版本命令:$ docker ps | grep activemq927860512 ... 
- HDU 2176 取(m堆)石子游戏 (尼姆博奕)
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2176 m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎 ... 
- UVA 11488 Hyper Prefix Sets (字典树)
			题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ... 
- amoeba读写分离
			第一单元 高性能mysql读写分离的实现 5.1 mysql读写分离 5.1.1 mysql读写分离概述 5.1.2 mysql读写分离原理 5.2 mysql读写分离配置 ... 
- 数据分析之Matplotlib
			一.Matplotlib的基础知识 Matplotlib中的基本图表包括的元素 •x轴和y轴 axis 水平和垂直的轴线 •x轴和y轴刻度 tick 刻度标示坐 ... 
- Prometheus监控学习笔记之Prometheus存储
			0x00 概述 Prometheus之于kubernetes(监控领域),如kubernetes之于容器编排.随着heapster不再开发和维护以及influxdb 集群方案不再开源,heapster ... 
- 一套权威的 MQTT Client 库
			主流的语言都支持,可链接到 github ,亲测golang client 简单好用 http://www.eclipse.org/paho/downloads.php 
