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;

题解

bzoj题目链接(权限题)

前置知识:广义容斥原理

考虑对于每个方案作为一个元素,每一位相同作为一个性质。

考虑在\(n\)个里选\(x\)个,要满足这\(x\)个性质,即集合中有\(x\)个相同,剩下\(n-x\)个集合里的元素可选可不选,但是不能都不选,要减去空集的一个,注意这里的集合指的是题目中的集合,

所以可得:
\[ \alpha (x) = \binom{n}{x} (2^{2^{n-x}}-1) \]
然后设\(\beta (x)\)为恰好有x个性质的元素个数,可得:
\[ \beta(x) = \sum _{i=x} ^{n} (-1)^{i-x}\binom{i}{x} \alpha(i) \]
答案为\(\beta (k)\)。

#include<bits/stdc++.h>
using namespace std;#define int long longvoid read(int &x) {x=0;int f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}void print(int x) {if(x<0) x=-x,putchar('-');if(!x) return ;print(x/10),putchar(x%10+'0');
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}#define maxn 1000050
#define mod 1000000007int n,fac[maxn],ifac[maxn],f[maxn],k;int qpow(int a,int x) {int res=1;for(;x;x>>=1,a=a*a%mod) if(x&1) res=res*a%mod;return res;
}signed main() {read(n),read(k);f[0]=2,fac[0]=ifac[0]=1;for(int i=1;i<=n;i++) f[i]=f[i-1]*f[i-1]%mod,fac[i]=fac[i-1]*i%mod;ifac[n]=qpow(fac[n],mod-2);for(int i=n-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod;int ans=0;for(int op=-1,i=k;i<=n;i++) {op=-op;ans=(ans+op*fac[n]*ifac[i]%mod*ifac[n-i]%mod*(f[n-i]-1)%mod*fac[i]%mod*ifac[k]%mod*ifac[i-k]%mod)%mod;}write((ans%mod+mod)%mod);return 0;
}

转载于:https://www.cnblogs.com/hbyer/p/10028522.html

[bzoj2893] 集合计数相关推荐

  1. 集合计数 二项式反演_对计数数据使用负二项式

    集合计数 二项式反演 The Negative Binomial distribution is a discrete probability distribution that you should ...

  2. 【离散数学】集合论 第三章 集合与关系(3) 集合计数的加法原理、容斥原理

    本文属于「离散数学」系列文章之一.这一系列着重于离散数学的学习和应用.由于内容随时可能发生更新变动,欢迎关注和收藏离散数学系列文章汇总目录一文以作备忘.此外,在本系列学习文章中,为了透彻理解数学知识, ...

  3. [bzoj2839]集合计数 题解 (组合数+容斥)

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

  4. [BZOJ 2839] 集合计数

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

  5. [BZOJ 2839]集合计数

    Description 题库链接 有 \(2^n\) 个集合,每个集合只包含 \([1,n]\) ,且这些集合两两不同.问有多少种选择方法(至少选一个),使得这些集合交集大小为 \(k\) . \(0 ...

  6. 集合计数 (容斥原理)

    心路: { 想了个思路打出来硬干掉了样例,然后发现是错的.... 当时直接崩了...烦躁滴很 ...其实这个思路和题解大方向上是一样的,想到了用至少含k个的方案数减去含k+1个的加上k+2的... 然 ...

  7. 【BZOJ2839】集合计数,容斥原理

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

  8. bzoj2839 集合计数

    题意 n个元素组成的集合有\(2^n\)个,现在在这些集合中选出若干个(至少1个)使得它们交集的大小为k,问选法种数. n<=10^6 分析 做得有点麻烦...有点怀疑人生... 如果两种选法中 ...

  9. [BZOJ2839]集合计数(容斥原理+组合数学)

    题目描述 传送门 题解 首先考虑固定k个元素,方案为 Ckn C_n^k 还剩下 2n−k 2^{n-k}个集合,可以任选若干个集合 C12n−k+C22n−k+..+C2n−k2n−k=22n−k ...

最新文章

  1. OpenGL版本与硬件支持
  2. 联想员工亲历联想大裁员:公司不是家
  3. UA MATH636 信息论7 高斯信道简介
  4. 简述ajax的重构原因,Ajax 重构的步骤
  5. Thread-方法以及wait、notify简介
  6. 【Java并发编程】java并发框架Executor学习笔记
  7. 把第三方jar包放入本地私服
  8. jvm系列(五):Java GC 分析
  9. php model db 赋值,PHP 框架 Model 层是否应该统一 DB 和 Cache
  10. Android中土司(Toast)的使用
  11. G_O_R加速器仿真之计算原理
  12. 矩阵论(四)——矩阵的广义逆
  13. 户外运动手持GPS设备常识汇总
  14. unity简单技能系统
  15. 四、Docker安装 Portainer 可视化工具
  16. 2022年RocketMQ面试题及答案
  17. uTools插件-Excalidraw轻量的在线白板绘图工具
  18. Kotlin 4. Kotlin 函数注解:Suppress,Volatile, Synchronized, Bindable, RequiresApi,SerializedName
  19. 大数据产品价值主张_大数据背景下新零售商业模式探究
  20. 教程 | 听说,你画画很慢,不如30分钟画速写

热门文章

  1. ant安装过程,配置过程
  2. Asp.net(C#)面试100+题陆续添加中……
  3. Linux进程间通信中的文件和文件锁
  4. IEEE的论文需要注意的一些
  5. 通过Katalon Automation Recorder 3步实现自动化测试
  6. 回首这六年,给新人一些建议,和同龄人共勉
  7. shell 语法格式
  8. 无密码身份验证:安全、简单且部署快速
  9. 这些你都了解么------程序员跳槽法则
  10. JavaScript定时调用函数(SetInterval与setTimeout)