题意

n个元素组成的集合有\(2^n\)个,现在在这些集合中选出若干个(至少1个)使得它们交集的大小为k,问选法种数.
n<=10^6

分析

做得有点麻烦...有点怀疑人生...
如果两种选法中交集中包含的k个元素不同,那么一定是不同的选法.所以可以先确定交集包含哪些元素,于是答案里有一个\(C^{k}_{n}\).接下来我们选的每个集合都必须包含这k个元素.包含这k个元素的集合有\(2^{n-k}\)个,那么从中选出若干个但不能一个都不选的方案数是\(2^{2^{n-k}}-1\).
那么最终答案肯定不是\(C^{k}_{n}(2^{2^{n-k}}-1)\),因为这里面算的方案只是交集至少有k个元素,其中的方案的实际交集大小可以大于k.
\(C^{k}_{n}(2^{2^{n-k}}-1)\)算的也不是交集至少k个元素的方案数,因为一个交集元素个数大于k的选取方案在这个式子里不止贡献1.假如一个方案A中交集大小为\(j(j>k)\),那么我们枚举\(C^{k}_{n}\)种选出k个元素作为交集的方式时,如果k个元素都是方案A中j个交集元素中的,那么方案A就会在这里被统计一次,因此方案A对这个式子的贡献为\(C^{k}_{j}\).
设\(g[k]=C^{k}_{n}(2^{2^{n-k}}-1),f[k]\)为交集大小恰好等于k的选取方案数.
那么\(g[k]=\sum^{n}_{i=k}C^{k}_{i}f[i]\)
把\(f[k]\)移项就可以DP了.由此可以得到一个\(O(n^2)\)的暴力DP,从\(f[n]\)到\(f[k]\)依次求解.

现在直接考虑每个\(g[i]\)对\(f[k]\)贡献的系数.假设这个系数是\(h[k][i](k\le i),\)那么\(f[k]=\sum_{i=k}^{n}g[i]\times h[k][i]\)
这个系数也可以暴力DP来计算.显然\(h[i][i]=1\),对于其他情况,\(g[i]\)先对\(f[j]\)作出贡献再从\(f[j]\)贡献到\(f[i]\),于是\(h[k][i]=\sum_{j=k+1}^{i} C_{j}^{k}h[j][i]\)
然后,然后我就不会了,然后,然后我就去看网上的题解,发现题解的式子长得和我推出来的形式差不多,只不过把\(h[k][i]\)换成了\((-1)^{i-k}C_{i}^{k}\).抱着怀疑的心情我写了个暴力DP算这个系数,发现确实是这样...一定要记得数学上来先打表
然后...\(h[k][i]=(-1)^{i-k}C_{i}^{k}\)这个结论是有理有据的,我们可以归纳.
\(k=i\)显然成立
否则\(h[k][i]=\sum_{j=k+1}^{i} (-1)\times C_{j}^{k}h[j][i]=\sum_{j=k+1}^{i} C_{j}^{k}\times (-1)^{i-j+1} \times C_{i}^{j}\)
考虑\(C_{i}^{j}\times C_{j}^{k}\)的含义,相当于从i个物品里选出j个,再从j个里选出k个.相当于把i个物品分为三组,分别有\((i-j),(j-k),k\)个.那么也相当于\(C_{i}^{k}\times C_{i-k}^{i-j}\),于是\(h[k][i]=(-1)\times \sum_{j=k+1}^{i} (-1)^{i-j}\times C^{i-j}_{i-k}\times C^{k}_{i}\)
\(=(-1)\times \sum_{j=k}^{i} (-1)^{i-j}\times C^{i-j}_{i-k}\times C^{k}_{i}+(-1)^{i-k}\times C^{k}_{i}\)
\(\sum_{j=k}^{i} (-1)^{i-j}\times C^{i-j}_{i-k}\)用一下二项式定理,就是\((1-1)^{i-k}\),所以相当于\(h[k][i]=(-1)^{i-k}\times C^{k}_{i}\)
这个式子似乎是可以直接容斥搞出来,然而辣鸡liu_runda并不会

#include<cstdio>
const int mod=1000000007,maxn=1000005;
int fac[maxn],inv[maxn];
int qpow(int a,int x,int M){int ans=1;for(;x;x>>=1,a=a*1ll*a%M){if(x&1)ans=ans*1ll*a%M;}return ans;
}
void init(){fac[0]=1;for(int i=1;i<maxn;++i)fac[i]=fac[i-1]*1ll*i%mod;inv[maxn-1]=qpow(fac[maxn-1],mod-2,mod);for(int i=maxn-1;i>=1;--i)inv[i-1]=inv[i]*1ll*i%mod;
}
int C(int n,int m){return fac[n]*1ll*inv[m]%mod*inv[n-m]%mod;
}
int main(){init();int ans=0;int n,k;scanf("%d%d",&n,&k);int flag=1;for(int i=k;i<=n;++i){if(flag){ans=(ans+C(n,i)*1ll*C(i,k)%mod*(qpow(2,qpow(2,n-i,mod-1),mod)-1+mod)%mod)%mod;}else{ans=(ans-C(n,i)*1ll*C(i,k)%mod*(qpow(2,qpow(2,n-i,mod-1),mod)-1+mod)%mod+mod)%mod;}flag^=1;}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/liu-runda/p/7119330.html

bzoj2839 集合计数相关推荐

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

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

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

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

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

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

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

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

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

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

  6. [bzoj2893] 集合计数

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

  7. [BZOJ 2839] 集合计数

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

  8. [BZOJ 2839]集合计数

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

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

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

最新文章

  1. c++编译器里的字体_从C的for和Python的for聊起
  2. 人人可用的在线抠图,还是AI自动化的那种!北大校友的算法被玩出新高度
  3. WinCE下多份BSP的维护技巧
  4. flutter 导航页面转换动画效果
  5. 256种编程语言大荟萃
  6. 1-物联网开发标配方案(预期方案使用说明和演示)
  7. 领导看了我写的关闭超时订单,让我出门左转!
  8. 在C#中使用反射的简单例子
  9. JBPM中文乱码的一种解决方法
  10. 一劳永逸地激活NOD32,从此不需要NOD32激活码
  11. X264码率控制总结——ABR,CQP,CRF
  12. IOS开发之——数据库-Couchbase(05)
  13. G - 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
  14. VBA批量导入图片到多Word文档并加标题(会飞的鱼)
  15. 如何获取qq邮箱的秘钥
  16. HTML5 中 40 个最重要的技术点
  17. java perfrences_Enterprise Resource Planning (ERP) | Oracle France
  18. 毕业季基于ssm框架的管理系统设计与实现如何写开题报告,怎么完成设计
  19. x86汇编_指令集大全_笔记_6
  20. 一篇文章带你了解云计算

热门文章

  1. 安装GIT(基于Ubuntu Desktop 12.04 LTS)
  2. Unity3D开发的赛车单机小游戏详细介绍(附有游戏下载链接)
  3. 安装VS2008关于解决磁盘已满问题方案.
  4. python numpy数组切片_python中numpy数组切片实验解释
  5. [JavaME]利用java.util.TimerTask来做Splash Screen的N种方法
  6. python3.9新特性_Python 3.9正式版,新特性提前一睹为快
  7. GitHub上最火的40个Android开源项目(一)
  8. 开源的魔兽世界参考架构——mangos
  9. dedecms mysql使用中_dedecms织梦数据库类使用方法$dsql
  10. tomcat的服务器目录在哪个文件夹,Tomcat目录结构详细介绍