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: 集合计数 容斥+组合

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

  2. BZOJ2839:集合计数(容斥,组合数学)

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

  3. BZOJ2839 集合计数 容斥

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

  4. bzoj 2839 集合计数 容斥\广义容斥

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

  5. bzoj2839 集合计数(容斥+组合)

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

  6. BZOJ2839 : 集合计数 (广义容斥定理)

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

  7. [BZOJ2839]:集合计数(组合数学+容斥)

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

  8. bzoj2839 集合计数 组合计数 容斥原理|题解

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

  9. 2019.02.09 bzoj2839: 集合计数(容斥原理)

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

随机推荐

  1. 如何将两个PDF文件合并到一个页面中

    在目前职场办公中,很多使用的文件格式是PDF文件格式,由于工作的需要,经常需要将PDF文件合并在一起,但由于PDF文件不能直接编辑修改,不能OFFICE,WPS那样,通过复制粘贴将两者合并,那如何解决 ...

  2. SQL 约束 索引

    --约束constraint--not null 非空约束create table demo01(empno number(4),ename varchar2(10) not null,job var ...

  3. mysql千万级数据量查询出所有重复的记录

    查询重复的字段需要创建索引,多个条件则创建组合索引,各个条件的索引都存在则不必须创建组合索引 有些情况直接使用GROUP BY HAVING则能直接解决:但是有些情况下查询缓慢,则需要使用下面其他的方 ...

  4. 使用Eureka作为springcloud的注册机

    使用springcloud做项目的负载均衡,需要导的jar这里不再显示,具体配置如下: 作为被注册服务配置: 启动多台服务端就可以实现集群,相应的localhost需要转成真实的ip 当然一个项目还要 ...

  5. 去除桌面SVN问号

    由于误操作,桌面文件全部带着问号. 找到一种比较方便的方法解决. 1.显示受保护文件.文件夹win7系统 - 随便打开一个文件夹 -  在菜单栏里点 工具 - 文件夹选项 - 查看 以下如图中选择 2 ...

  6. [ionic3.x开发记录]ng-content使用

    在ionic开发公用组件的时候,我一直在想有没有angular有没有像vue一样的slot插槽.方便组件后期扩展. 然后去翻文档,发现有ng-content这么个东西,用法很像vue的slot. 组件 ...

  7. Spring Boot(一):环境搭建,建立简单项目

    一.基本环境搭建 1.下载IntelliJ IDEA :http://www.jetbrains.com/idea/ 2.拖到页面最下面下载旗舰版 3.新建项目 4.设置本地Maven 5.删除多于文 ...

  8. python numpy库的基本内容

    import numpy as np np.getfromtxt("路径",delimiter = "," ,dtype = str)  #读取txt文件数据 ...

  9. JVM深入:JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)(转)

    转载自:https://www.cnblogs.com/yulei126/p/6777323.html 1.背景 2.为什么废弃永久代(PermGen) 3.深入理解元空间(Metaspace) 4. ...

  10. 59A

    #include <stdio.h> #include <string.h> #define MAXSIZE 120 int main() { int cntlow=0; in ...