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;

Solution

首先考虑一下容斥
设$f(k)$表示选出一些集合使它们交集大小至少为$k$的方案数。
那么$f(k)=C_n^k \times (2^{2^{n-k}}-1)$
这玩意儿怎么理解呢?也就是先把那$i$个数确定下来,然后有$2^{n-k}$个集合可以包含那$k$个数。这些集合要么选要么不选,但不能一个都不选,也就是不能为空集。所以有$2^{2^{n-k}}-1$种选择方法。
那么容斥系数呢?可以发现当计算交集至少为$k$的方案时候,交集至少为$j$的方案($j>k$)会被计算$C_j^k$次。
也就是说,
$f(k)$的系数为$1$。
$f(k+1)$的系数为$-C_{k+1}^k$。
$f(k+2)$的系数为$-C_{k+2}^k+C_{k+1}^k\times C_{k+2}^{k+1}=C_{k+2}^k$
为什么$f(k+2)$能那么推呢……因为$C_N^M\times C_M^S=C_N^S\times C_{N-S}^{N-M}$
搞到现在基本可以组合计数搞搞出解了,至于那个大的一比的$2^{2^{n-k}}$,根据欧拉定理直接指数取模$φ(MOD)$就好了,显然$φ(MOD)=MOD-1$。

Code

 #include<iostream>
#include<cstdio>
#define N (1000009)
#define LL long long
#define MOD (1000000007)
using namespace std; LL n,k,ans,inv[N],fac[N],facinv[N],p[N]; void Init()
{
inv[]=fac[]=facinv[]=p[]=;
for (int i=; i<=n; ++i)
{
if (i!=) inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;
fac[i]=fac[i-]*i%MOD; facinv[i]=facinv[i-]*inv[i]%MOD;
p[i]=p[i-]*%(MOD-);
}
} LL Qpow(LL a,LL b)
{
LL ans=;
while (b)
{
if (b&) ans=ans*a%MOD;
a=a*a%MOD; b>>=;
}
return ans;
} LL C(LL n,LL m)
{
if (n<m) return ;
return fac[n]*facinv[m]%MOD*facinv[n-m]%MOD;
} int main()
{
scanf("%lld%lld",&n,&k);
Init();
for (int i=k,j=; i<=n; ++i,j=-j)
ans+=j*C(n,i)*(Qpow(,p[n-i])-)%MOD*C(i,k)%MOD;
ans=(ans%MOD+MOD)%MOD;
printf("%lld\n",ans);
}

BZOJ2839:集合计数(容斥,组合数学)的更多相关文章

  1. bzoj2839: 集合计数 容斥+组合

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

  2. BZOJ2839 集合计数 容斥

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

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

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

  4. 2015 asia xian regional F Color (容斥 + 组合数学)

    2015 asia xian regional F Color (容斥 + 组合数学) 题目链接http://codeforces.com/gym/100548/attachments Descrip ...

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

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

  6. bzoj2839 集合计数(容斥)

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

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

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

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

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

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

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

随机推荐

  1. JUC源码1-原子量

    什么是原子量,原子量就是一次操作,要么成功,要么失败.比如java中的i++ 或i-- , 不具备原子性,每次读取的值都是不一样的,探究其原因,x86体系中,他的总线是32位的,i++的操作指令必须是 ...

  2. [日常] Go语言圣经--Channel习题

    练习 8.3: 在netcat3例子中,conn虽然是一个interface类型的值,但是其底层真实类型是*net.TCPConn,代表一个TCP连接.一个TCP连接有读和写两个部分,可以使用Clos ...

  3. 排查CentOS7.0的联网情况

    1.ifconfig命令. 查看网络配置是否有问题 在/etc/sysconfig/network-scripts/ifcfg-ens33里面配置好网络,记住onboot=on这个选项一定要设置,不然 ...

  4. 漫画 | Java多线程与并发(一)

    1.什么是线程? 2.线程和进程有什么区别? 3.如何在Java中实现线程? 4.Java关键字volatile与synchronized作用与区别? volatile修饰的变量不保留拷贝,直接访问主 ...

  5. Windows Server 2008R2常见的500错误

    每次公司服务器装系统后再去部署服务,都会碰到这个问题,这里记录一下问题的解决方法 遇到“500 – 内部服务器错误. 您查找的资源存在问题,因而无法显示.”的问题. 解决办法: 1.解决方法:打开II ...

  6. java设计模式-----20、模板方法模式

    概念: Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. 模板方法模式的应 ...

  7. pts/0代表什么意思?

    在linux命令行中经常看到pts/0,这是什么意思呢??妈蛋!! 先说pts/0吧,man里面是这样说的:ptmx and pts - pseudo-terminal master and slav ...

  8. __repr__与__str__

    首先我们来举个例子,定义一个长方行类Cuboid,长为x,宽为y,高为z class Cuboid: def __init__(self, x = 3, y = 1, z = 2): self.x = ...

  9. js实现禁止右键 禁止f12 查看源代码

    document.oncontextmenu = function () { return false; }; document.onkeydown = function () { if (windo ...

  10. Vue -- vue-cli(vue脚手架) npm run build打包优化

    这段时间公司新项目立项,开发组选用 Vue2.0 进行开发.当然也就一并用到 vue cli 进行自动化构建.结果在基础版本开发完成后,用 npm run build 命令打包上线时,发现以下几个问题 ...