题目描述

传送门

题解

首先考虑固定k个元素,方案为 Ckn C_n^k
还剩下 2n−k 2^{n-k}个集合,可以任选若干个集合 C12n−k+C22n−k+..+C2n−k2n−k=22n−k C_{2^{n-k}}^1+C_{2^{n-k}}^2+..+C_{2^{n-k}}^{2^{n-k}}=2^{2^{n-k}}
但是这样选出来的有可能有不合法的,交集大小可能大于k,所以要减去k+1,加上k+2…
就是个容斥了
设 f(k)=Ckn∗(22n−k) f(k)=C_n^k*(2^{2^{n-k}})
那么答案应该为 f(k)∗Ckk−f(k+1)∗Ckk+1+f(k+2)∗Ckk+2...f(n)∗Ckn f(k)*C_k^k-f(k+1)*C_{k+1}^k+f(k+2)*C_{k+2}^k...f(n)*C_n^k
容斥系数我刚开始是找的规律,但是后来发现,因为第一项即使不考虑交集大小可以大于k的情况,也会多出来很多重复的情况,因为选取的k个元素和选取的集合可能是重复的。那么后面进行容斥的时候就要利用组合数将重复的去掉
对于 22n−k 2^{2^{n-k}}的求法,可以变成 22n−k mod φ(p) 2^{2^{n-k}\space mod\space \varphi(p)}。根据欧拉定理 aφ(p)≡1(modp),(a,p)=1 a^{\varphi(p)}\equiv 1\pmod p,(a,p)=1,可以得出 an−φ(p)≡an(modp) a^{n-\varphi(p)}\equiv a^n\pmod p,而这里的a和p显然是互质的。
这题如果直接暴力的话会非常慢。比较科学的做法是线性推出逆元然后再预处理阶乘和逆元的阶乘,以及2的整数次幂。这样速度就比较优秀了
线性推逆元方法 inv(i)=(p−p/i)∗inv(p%i)%p inv(i)=(p-p/i)*inv(p\%i)\%p,初始 inv(1)=1 inv(1)=1

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define Mod 1000000007
#define N 1000005
#define LL long longint n,k,f;
LL mi[N],mul[N],inv[N],ans;void calc(int n)
{mul[0]=1;for (int i=1;i<=n;++i) mul[i]=mul[i-1]*(LL)i%Mod;inv[1]=1;for (int i=2;i<=n;++i) inv[i]=inv[Mod%i]*(Mod-Mod/i)%Mod;inv[0]=1;for (int i=1;i<=n;++i) inv[i]=inv[i]*inv[i-1]%Mod;mi[0]=1;for (int i=1;i<=n;++i) mi[i]=mi[i-1]*(LL)2%(Mod-1);
}
LL fast_pow(LL a,int p,int mod)
{LL ans=1;for (;p;p>>=1,a=a*a%mod)if (p&1)ans=ans*a%mod;return ans;
}
LL C(int n,int m)
{if (m>n) return 0;return mul[n]*inv[m]%Mod*inv[n-m]%Mod;
}
int main()
{scanf("%d%d",&n,&k);calc(n);f=1;for (int i=k;i<=n;++i,f=-f)ans+=C(n,i)*(fast_pow(2,mi[n-i],Mod)-1)%Mod*C(i,k)%Mod*f;ans=(ans%Mod+Mod)%Mod;printf("%lld\n",ans);
}


[BZOJ2839]集合计数(容斥原理+组合数学)相关推荐

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

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

  2. bzoj2839 集合计数

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

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

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

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

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

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

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

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

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

  7. BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]

    4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...

  8. [bzoj2893] 集合计数

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

  9. upc 个人训练赛第三场:排课表(容斥原理+组合数学)

    问题 A: 骑车还是走路 题目描述 在石油大学校园里,没有自行车,上课办事会很不方便.但实际上,并非去办任何事情都是骑车快,因为骑车总要找车.开锁.停车.锁车等,这要耽误一些时间.假设找到自行车,开锁 ...

最新文章

  1. linux+xampp搭建WordPress个人网站过程详解
  2. Android ndk使用
  3. Python如何打包EXE可执行文件
  4. 监听 html dom 变化,如何监听页面 DOM 变动并高效响应
  5. 查看Oracle 版本信息
  6. PostgreSQL的 initdb 源代码分析之二十一
  7. 分布式系统中,权限设计实践
  8. RHEL 8 - 用VM Image Builder构建虚机镜像
  9. CCNA路由协议总结之IGRP
  10. Edge自带的数学求解器介绍
  11. 【引用】43种名车标志及来历
  12. 华氏温度和摄氏温度互相转换
  13. 美通企业日报 | 信达生物与礼来制药达成战略合作;希尔顿旗下康莱德酒店亮相天津...
  14. python表示倍数_python输出倍数
  15. uClinux移植与分析(3)
  16. Zeppelin解释器的REST API接口
  17. 【转】指定页面进行Monkey测试
  18. 2017年南海区青少年信息学奥林匹克竞赛(小学甲组)
  19. ipad mini 4:ipad is disabled connect to iTunes
  20. 如何在word任意页插入页眉页脚

热门文章

  1. 2018-5-31 服务器上一个webshell
  2. 阻止搜索引擎抓取网站的工具_使用PHP将抓取的网站转变为搜索引擎
  3. JAVA封神榜之九尾妖狐,盘点《封神演义》中的7位散修大妖,孔宣排第三,九尾妖狐排第六...
  4. Laravel+cms
  5. (最详细)VueApp项目实战2 - - 首页制作
  6. Python博文_爬虫工程师是干什么的
  7. Android应用图标设计
  8. 查找算法【哈希表】 - 散列查找及性能分析
  9. 微信 米聊 导游 服务器 李白,星图注册开户_李白、谢灵运、白居易当导游,跟着诗词漫游缙云山水~ | 星图注册-星图测速官网...
  10. ls命令只显示目录或文件