Description

一个有N个元素的集合有2N个不同子集(包含空集),现在要在这2N个集合中取出若干集合(至少一个),使得

它们的交集的元素个数为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;

Sol

恰好xx的问题,很大几率是容斥。。。

冷静分析一下,我们现在假设钦定了K个数字作为交集的最终结果,那么包含这些数字数字组成的集合就可以随便选,这样的方案数是\(C(n,k)*(2^{2^{n-i}}-1)\)(这里空集是不合法的)。但是这样算出来的是“至少有K个”,我们要用容斥来处理一下,而且这里的方案是有序的,所以容斥系数是还要乘以组合数。具体地,恰好选j个的每个方案里面,都包含了\(C(j,i)\)个有i个的,要算入系数。

至此本题的解法就完了,但是有一个问题:\(2^{2^{n-i}}\)是不能快速幂的,所以我们用递推法,开始的时候\(t=1\),每循环一次,\(t=t*(t+2)\)。

Code

#include <cstdio>
#define ll long long
ll n,k,A,fac[1000005],ifc[1000005],inv[1000005],P=1000000007;
ll c(int x,int y){return 1ll*fac[x]*ifc[y]%P*ifc[x-y]%P;}
int main()
{
scanf("%lld%lld",&n,&k);
inv[1]=fac[0]=ifc[0]=fac[1]=ifc[1]=1;
for(int i=2;i<=n;i++) inv[i]=(P-(P/i)*inv[P%i])%P,fac[i]=fac[i-1]*i%P,ifc[i]=ifc[i-1]*inv[i]%P;
for(ll i=n,op=((n-k)&1)?-1:1,t=1;i>=k;i--) A=(A+P+op*c(i,k)*c(n,i)%P*t%P)%P,op=-op,t=t*(t+2)%P;
printf("%lld\n",A);
}

【BZOJ2839】集合计数 容斥原理+组合数的更多相关文章

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

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

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

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

  3. 【BZOJ-2839】集合计数 容斥原理 + 线性推逆元 + 排列组合

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

  4. BZOJ 2839: 集合计数 [容斥原理 组合]

    2839: 集合计数 题意:n个元素的集合,选出若干子集使得交集大小为k,求方案数 先选出k个\(\binom{n}{k}\),剩下选出一些集合交集为空集 考虑容斥 \[ 交集为\emptyset = ...

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

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

  6. bzoj2839 集合计数(容斥)

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

  7. bzoj2839 集合计数

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser  Logout 捐赠本站 2839: 集合计数 Time ...

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

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

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

    传送门 题意简述:对于一个有N个元素的集合在其2^N个子集中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数. 思路:考虑枚举相交的是哪kkk个,有CnkC_n^kCnk​种方案 ...

随机推荐

  1. linux中zookeeper

    linux中zookeeper 安装jdk tar -zxvf jdk-11.0.1_linux-x64_bin.tar.gz -C /usr/src sudo vim /etc/profile 输入 ...

  2. java - 输入的字符串中是否包含中文

    今天和同事在讨论一个问题,需要检查“输入的字符串中是否包含中文”,刚开始想到是用正则表达式,正则表达式中是以[u4e00-u9fa5]来全匹配字符是否是中文,但现在面临的问题是这个字符串中还可能包含英 ...

  3. 去掉字符串中的html标签

    public static string removeHtml(string html) { System.Text.RegularExpressions.Regex regex1 = new Sys ...

  4. java中的 equals 与 ==

    Java中的"=="永远比较的是两个对象是否是同一个对象(引用指向同一块内存就是同一个对象) Java中equals() 在使用必须与类挂上钩,不能单独使用.有的人这样理解&quo ...

  5. request.getHeader("x-forwarded-for")这是什么意思

    request.getHeader,简单的说就是获取请求的头部信息,根据http协议,它能获取到用户访问链接的信息,以下是我们常用的: request.getHeader("referer& ...

  6. mysql如何进行以=分割的字符串的拆分

    SUBSTRING_INDEX(str, delim, count) str: 要处理的字符串 delim: 分割符 count: 计数 如果为正数,则从左开始数,如果为负数,则从右开始数 使用示例: ...

  7. [转载]C语言 宏

    当然宏定义非常重要的,它可以帮助我们防止出错,提高代码的可移植性和可读性等. 1,防止一个头文件被重复包含 #ifndef COMDEF_H#define COMDEF_H //头文件内容 …#end ...

  8. 1 JPA入门----项目搭建以及CRUD

    maven搭建JPA开发环境 1 依赖的maven pom文件     主要有hibernate-core.hibernate-entitymanager.javax-persistence.mysq ...

  9. 为什么学习python?(知乎大神的回答)

    学习PHP 是因为得到一份工作 学习Java 是因为他们选修了计算机科学这门课程 学习python 是因为爱这门语言,因为寻求美

  10. JSP,PHP详细性能测试

    前几天在CU看到有人比较PHP与JSP,.net,结果表明PHP比JSP,.net性能低下很多.本人认为即使有差距,也不应该有这么大,所以认真测试一下几者间的性能差距.由于很久没用.net了,所以,暂 ...