bzoj2839 集合计数(容斥)
2839: 集合计数
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 883 Solved: 490
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
【样例说明】
假设原集合为{A,B,C}
则满足条件的方案为:{AB,ABC},{AC,ABC},{BC,ABC},{AB},{AC},{BC}
【数据说明】
对于100%的数据,1≤N≤1000000;0≤K≤N;
Source
这若干个集合的交集的方案数:$C(n,k)$
那么问题就转化成:对剩下的$m=n-k$个数,求集合取法,使它们之间没有交集
这种计数问题一般用容斥瞎搞
先求出$m$个数构成的集合的所有取法:$2^{2^{m}}-1$
共$2^{m}$个集合,每个集合可取可不取$(2^{2^{m}}\; )$,再减去一个都不取的情况$(-1)$(试试n=k的情况)
蓝后我们把交集$>=1$的取法减掉:$-C(m,1)*(2^{2^{m-1}\; }-1)$
但是我们发现有多减了交集$>=2$的取法,于是再加回来$+C(m,2)*(2^{2^{m-2}\; }-1)$
...............
这就是容斥原理计数的基本套路辣
于是答案为$C(n,k)*\sum_{i=0}^{m=n-k}\; \; \; (-1)^i*C(m,i)*(2^{2^{m-i}}-1)$
后面这个$2^{2^{m-i}}$咋算呢
注意到$2^{2^m}\; =2^{2^{m-1}}\; *2^{2^{m-1}}\; $
于是我们倒着枚举$i$,每次统计完平方以下就好辣
注意别爆int了鸭TAT
#include<iostream>//注意防爆int
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
#define N 1000005
const ll P=;
int n,k,m;ll ans,nw,inv[N],fac[N],ifac[N];
inline ll C(int a,int b){return fac[a]*ifac[b]%P*ifac[a-b]%P;}
int main(){
scanf("%d%d",&n,&k);
inv[]=; fac[]=fac[]=ifac[]=ifac[]=;
for(int i=;i<=n;++i){
inv[i]=1ll*(P-P/i)*inv[P%i]%P;//乘法逆元线性预处理
fac[i]=fac[i-]*i%P;
ifac[i]=ifac[i-]*inv[i]%P;
}m=n-k;nw=;
for(int i=m;i>=;--i,nw=nw*nw%P)//倒着枚举i
ans=((ans+((i&)?-:)*C(m,i)%P*(nw-)%P)%P+P)%P;
ans=ans*C(n,k)%P;
printf("%lld",ans);
return ;
}
bzoj2839 集合计数(容斥)的更多相关文章
- bzoj2839: 集合计数 容斥+组合
2839: 集合计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 523 Solved: 287[Submit][Status][Discuss] ...
- BZOJ2839:集合计数(容斥,组合数学)
Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007. ...
- BZOJ2839 集合计数 容斥
题目描述(权限题qwq) 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模100000000 ...
- bzoj 2839 集合计数 容斥\广义容斥
LINK:集合计数 容斥简单题 却引出我对广义容斥的深思. 一直以来我都不理解广义容斥是为什么 在什么情况下使用. 给一张图: 这张图想要表达的意思就是这道题目的意思 而求的东西也和题目一致. 特点: ...
- bzoj2839 集合计数(容斥+组合)
集合计数 内存限制:128 MiB 时间限制:1000 ms 标准输入输出 题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 ...
- BZOJ2839 : 集合计数 (广义容斥定理)
题目 一个有 \(N\) 个 元素的集合有 \(2^N\) 个不同子集(包含空集), 现在要在这 \(2^N\) 个集合中取出若干集合(至少一个), 使得它们的交集的元素个数为 \(K\) ,求取法的 ...
- [BZOJ2839]:集合计数(组合数学+容斥)
题目传送门 题目描述 .(是质数喔~) 输入格式 一行两个整数N,K. 输出格式 一行为答案. 样例 样例输入: 3 2 样例输出: 样例说明 假设原集合为{A,B,C} 则满足条件的方案为:{AB, ...
- bzoj2839 集合计数 组合计数 容斥原理|题解
集合计数 题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007.(是 ...
- 2019.02.09 bzoj2839: 集合计数(容斥原理)
传送门 题意简述:对于一个有N个元素的集合在其2^N个子集中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数. 思路:考虑枚举相交的是哪kkk个,有CnkC_n^kCnk种方案 ...
随机推荐
- XML自学笔记
1. xml指可扩展标记语言,(extensible markup language),该语言被设计用来传输和存储数据,HTML被设计用来显示数据 XML标签没有被预定义,需要自定义标签:XML ...
- 嵌入式linux内存越界定位和解决 (转)
https://blog.csdn.net/meejoy/article/details/41729585 https://blog.csdn.net/killmice/article/details ...
- 鱼刺 winhttp
winhttp com 对象 网页_访问_对象 api wininet 网页访问 下划线命名法 驼峰命名法 小驼峰 JS内置的一些 大驼峰 api 多线程用 coinitializ ...
- java_xml_解析
xml解析的两种的基本方式 1:SAX解析:一行一行的解析,不回头 2:DOM解析:将整个XML以树状读到内存中,然后需要哪一部分就取哪一部分 SAX解析: 基于java的步骤: //1.获取解析工厂 ...
- 20165311 《网络对抗技术》 Kali安装
一.目的要求 下载 安装 网络 共享 软件源 二.主要步骤 从官网下载软件安装包 安装的比较顺利 具体截图就不放上来了 安装结果图: 网络配置和共享文件夹设置 网络配置: 由于我之前安装虚拟机,所以并 ...
- :before和::before的区别
单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素.伪元素和伪类之所以这么容易混淆,是因为他们的效果类似而且写法相仿,但实际上 css3 为了区分两者,已经明确规定了伪类用一个冒号来表示, ...
- kubernetes in action - Services
问题,如何将Pod所提供的功能提供给别人用?微服务,是服务,所以关键要把服务提供出去 直接把pod的静态ip提供给用户用,这个会有很多问题,比如failover,扩容,负载均衡等 所以需要servic ...
- 遍历其 interator
当用户自定义数据结构的时候, 如果做遍历呢, 这个时候就需要遍历器 interator 了, 它允许用户定义遍历自己自定义数据结构的方式 当用户定义了iterator, 就可以使用 for of 来遍 ...
- 在windows上搭建git server Gitblit
在Windows上搭建Git Server 第1步:下载Java并安装Java.我这里下载的是jdk1.7.0_79 第2步:配置Java环境变量 右键” 计算机” => ”属性” => ...
- 3、配置XShell上传文件
1.yum -y install lrzsz(安装 lrzsz) 2.rz -y(会弹出选择文件框,选择上传文件)