题目描述

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

输入格式

一行两个整数N,K

输出格式

一行为答案。

样例

样例输入

3 2

样例输出

6

数据范围与提示

样例说明

假设原集合为{A,B,C}

则满足条件的方案为:{AB,ABC},{AC,ABC},{BC,ABC},{AB},{AC},{BC}

数据说明

对于100%的数据,1≤N≤1000000;0≤K≤N;

思路:

  做数学题之前一定打个表。。。题解一贯作风,上来不打正解。。。

  前置知识:一个集合所有的子集个数为2^n每个元素是否出现,那么选子集的方案数为2^(2^n)-1每个集合是否出现,减一是因为一个集合都不选和选空集重了,少算一个。

  70%算法:DP真他娘的是啥都能干 ,我们不会算集合为n,交集为k的方案,那就设出来啊。。f[n][k]就是答案,f[n][k]=C(n,k)*f[n-k][0],意思是先选出来k个再选交集为0的,那么f[n][0]咋算,它可以从选所有的集合数2^(2^n)-1-f[n][k]得到,然而f[n][k]从之前的f[n-k][0]得到,没毛病后效性也没得,他娘的就用你打表了。。(此处借用WD大神代码)

 1 #include<cstdio>
 2 #define int long long
 3 const long long mod=1000000007;
 4 long long fac[1000005],inv[1000005],invv[1000005],x,y,n,k,f0[1000005],f[1000005];
 5 long long pow(long long b,long long t,long long modd,long long ans=1){
 6     for(;t;t>>=1,b=b*b%modd)if(t&1)ans=ans*b%modd;
 7     return ans;
 8 }
 9 signed main(){
10     scanf("%lld%lld",&n,&k);
11     fac[0]=inv[0]=invv[0]=f0[0]=invv[1]=inv[1]=fac[1]=1;f0[1]=2;
12     for(int i=2;i<=n;++i)fac[i]=fac[i-1]*i%mod,invv[i]=(-mod/i*invv[mod%i])%mod,inv[i]=inv[i-1]*invv[i]%mod;
13     for(int i=1;i<=n;++i){
14         f0[i]=(pow(2,pow(2,i,mod-1),mod)-1+mod)%mod;
15         for(int j=1;j<=i;++j)f[j]=fac[i]*inv[j]%mod*inv[i-j]%mod*f0[i-j]%mod,f0[i]=(f0[i]-f[j]+mod)%mod;
16         f[0]=f0[i];
17     }
18     printf("%lld\n",(f[k]+mod)%mod);
19 }

View Code

  100%算法:乖乖打正解,先选k个,n-=k,现在我们要求的就是集合为n,交集为0的方案,这时候我们重新找一个集合的定义(本人思路卒于此),集合A表示包含一个确定元素a的方案的总和,那么会有n个集合向像花一样绽放,有各种交集例如图中中间二级重叠不包含E部分表示交集恰有2个的方案。那么我们就要求一级部分的大小(就是要求的无交集的方案),仿佛嗅到了一丝容斥的气息。。。。交集为0=总-(>=1)+(>=2)-.......

  ans=Σ(-1)^i*C(n,i)*(2^(2^(n-i))-1);

  PS:所谓的次方的次方可以用递推,当然你打两层快速幂我也没办法。。

  

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int mn=1e6+20,mod=1e9+7;
int f[mn],fac[mn],inv[mn],n,k;
int qpow(int x,int k)
{int ans=1;for(;k;k>>=1,x=1ll*x*x%mod) if(k&1) ans=1ll*ans*x%mod;return ans;
}
long long C(int n,int m) {return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;}
int main()
{scanf("%d%d",&n,&k);fac[0]=1;for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod;inv[n]=qpow(fac[n],mod-2);for(int i=n;i;i--) inv[i-1]=1ll*inv[i]*i%mod;long long ans=0,tmp=C(n,k),tp=1;n-=k;int op=(n&1)?-1:1;for(int i=n;~i;i--){ans=(ans+op*C(n,i)*tp%mod)%mod;tp=(tp*tp%mod+2*tp%mod)%mod;op=-op;}ans=ans*tmp%mod;printf("%lld\n",(ans+mod)%mod);
}
//for sigma i=0->n C(n,i)(2^(2^(n−i))−1)
/*
g++ 1.cpp -o 1
./1
4 1
*/

View Code

转载于:https://www.cnblogs.com/starsing/p/11129307.html

[BZOJ 2839] 集合计数相关推荐

  1. [BZOJ 2839]集合计数

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

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

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

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

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

  4. [bzoj2893] 集合计数

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

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

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

  6. [BZOJ 2734] 集合选数

    Link: BZOJ 2734 传送门 Solution: 真是奥妙重重的建模啊..... 我们发现$x,2*x,3*x$这些数太分散了,难以处理 于是我们构建这样的表格: x  3x  9x  27 ...

  7. BZOJ 1016--[JSOI2008]最小生成树计数(kruskal搜索)

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 7429  Solved: 3098 [Submit][ ...

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

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

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

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

最新文章

  1. Android Toolbar Padding
  2. Python: datetime 转换
  3. hdu 1880 魔咒词典
  4. java java se_Java SE 11:推动Java前进
  5. 总结了线程安全性的二十四个精华问题
  6. Guava翻译系列之EventBus
  7. android导入导出txt通讯录,Android导入导出txt通讯录工具
  8. Cocos2d-x 3.x如何通过WebSocket连接服务器进行数据传输
  9. asp.net web开发框架_Python之Web开发框架学习 发送电子邮件
  10. 强迫症福利--收起.NET程序的dll来
  11. 自定义MVC框架之工具类-图像处理类
  12. photoshop菜鸟实用入门(2)----常用的一些快捷操作
  13. deep_learning 03. tf.nn.rnn_cell.MultiRNNCell()
  14. java在线聊天项目1.0版 异常处理——开启多个客户端,关闭一个客户端后,在其他客户端中再发出信息会出现异常的处理...
  15. Unity资源加载以及释放
  16. java开发接口文档_java之接口文档规范
  17. 六句话,看完新造车的2021
  18. biopython教程与手册_使用biopython处理序列数据
  19. HDOJ 2856 How far away ?
  20. 怎么用Python爬取抖音小视频? 资深程序员都这样爬取的(附源码)

热门文章

  1. ASP.NET MVC学习资料 新增几个开源项目
  2. 外部类的静态成员不允许直接使用非静态内部类
  3. C#编程语言之MD5加密的两种方式
  4. C++用string 定义字符串数组
  5. java 新浪天气预报接口_根据新浪天气API获取各地天气状况(Java实现)
  6. 计算机技术在职研究生学校,计算机技术在职研究生招生2020
  7. java groovy jar包_如何将jar包包含在groovy脚本中?
  8. java 1.8 rpm_jdk1.8下载 Java Development Kit 8(jdk1.8) 8u131 linux 1586 rpm 官方正式版 下载-脚本之家...
  9. c++如何让字符串重复输出_2020.10.02错题总结之字符串相关函数
  10. Linux查看谁修改的文件,linux如何查看近来修改的文件