bzoj2839 集合计数(容斥)

时间:2022-09-06 19:47:56

2839: 集合计数

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 883  Solved: 490
[Submit][Status][Discuss]

Description

一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得
它们的交集的元素个数为K,求取法的方案数,答案模1000000007。(是质数喔~)

Input

一行两个整数N,K

Output

一行为答案。

Sample Input

3 2

Sample Output

6

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 集合计数(容斥)的更多相关文章

  1. bzoj2839&colon; 集合计数 容斥&plus;组合

    2839: 集合计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 523  Solved: 287[Submit][Status][Discuss] ...

  2. BZOJ2839&colon;集合计数&lpar;容斥&comma;组合数学&rpar;

    Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007. ...

  3. BZOJ2839 集合计数 容斥

    题目描述(权限题qwq) 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模100000000 ...

  4. bzoj 2839 集合计数 容斥&bsol;广义容斥

    LINK:集合计数 容斥简单题 却引出我对广义容斥的深思. 一直以来我都不理解广义容斥是为什么 在什么情况下使用. 给一张图: 这张图想要表达的意思就是这道题目的意思 而求的东西也和题目一致. 特点: ...

  5. bzoj2839 集合计数(容斥&plus;组合)

    集合计数 内存限制:128 MiB 时间限制:1000 ms 标准输入输出     题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 ...

  6. BZOJ2839 &colon; 集合计数 &lpar;广义容斥定理&rpar;

    题目 一个有 \(N\) 个 元素的集合有 \(2^N\) 个不同子集(包含空集), 现在要在这 \(2^N\) 个集合中取出若干集合(至少一个), 使得它们的交集的元素个数为 \(K\) ,求取法的 ...

  7. &lbrack;BZOJ2839&rsqb;&colon;集合计数(组合数学&plus;容斥)

    题目传送门 题目描述 .(是质数喔~) 输入格式 一行两个整数N,K. 输出格式 一行为答案. 样例 样例输入: 3 2 样例输出: 样例说明 假设原集合为{A,B,C} 则满足条件的方案为:{AB, ...

  8. bzoj2839 集合计数 组合计数 容斥原理&vert;题解

    集合计数 题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007.(是 ...

  9. 2019&period;02&period;09 bzoj2839&colon; 集合计数(容斥原理)

    传送门 题意简述:对于一个有N个元素的集合在其2^N个子集中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数. 思路:考虑枚举相交的是哪kkk个,有CnkC_n^kCnk​种方案 ...

随机推荐

  1. 创建一个Portlet工程

    使用Liferay的SDK创建一个简单的Portlet,此Portlet不包括业务逻辑.不包括数据库,只有简单的页面展现,用以说明Portlet的开发过程. 一.创建Portlet工程 1.打开Lif ...

  2. iOS - &lpar;调用系统本机发送短信功能&rpar;

    今天处理一个订单详情的界面,在订单详情页面上有联系方式(电话号码),在电话号码的右边有两图片,一个是电话样式的,一个是短信样式的,做为一名程序员(号称攻城师)一眼看下去就应该是一个 button,而不 ...

  3. T型架构观点学习

    一.成为T型人才 眼界格局思维要尽可能的开阔,并不断横向开阔,专业能力要尽可能专注,并且纵向上不断加深: 互联网的快速迭代开发和扁平化管理,使单纯管理人才的作用越来越小,除了分配任务和项目管理,在其他 ...

  4. SOLID &lpar;面向对象设计&rpar; 基本原则

      SOLID (面向对象设计) 基本原则    在 程序设计领域, SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特•C•马丁在21世纪早期[1] 引入的记忆术首字母缩略 ...

  5. Linux中命令行编译java接口总是提示找不到符号的疑难杂症的解决

    今天学习java的接口,在linux的命令行下写代码练练手吧,啪啪啪一顿猛敲,写了一个接口UsbInserface,UDisk继承UsbInterface,写完了那就编译到bin目录呗. 当时写程序的 ...

  6. 每天一个Linux命令(17)--whereis命令

    whereis 命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返所有信息. 和find相比,whereis查找的速度非 ...

  7. MySQL事务与锁

    MySQL事务与锁 锁的基本概念 锁是计算机协调多个进程或线程并发访问某一资源的机制. 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISA ...

  8. Codeforces 1076F Summer Practice Report dp

    Summer Practice Report dp[ i ][ 0 ]表示放完前 i 页, 第 i 页最后一段是 0, 0个数的最小值. dp[ i ][ 1 ]表示放完前 i 页, 第 i 页最后一 ...

  9. python下载文件的三种方法

    Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件.此外Python还提供了另外一种方法 ...

  10. maven使用阿里云maven库

    在maven\conf\settings.xml中的mirrors添加 <mirror> <id>nexus-aliyun</id> <name>Nex ...