2839: 集合计数

题意:n个元素的集合,选出若干子集使得交集大小为k,求方案数


先选出k个\(\binom{n}{k}\),剩下选出一些集合交集为空集

考虑容斥

\[交集为\emptyset = 任意选的方案数-交集\ge 1 的方案数+交集\ge 2的方案数-...
\]

交集\(\ge i\)就是说先选出i个元素在交集里,剩下的元素的集合任选

那么就是

\[\sum_{i=0}^n \binom{n}{i}(2^{2^{n-i}}-1)
\]

组合数直接推阶乘和逆元

后面的\(2^{2^x}\),考虑快速幂的过程\(2^{2^i}=2^{2^{i-1}}2^{2^{i-1}}\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=1e6+5, P=1e9+7;
typedef long long ll;
inline int read(){
char c=getchar(); int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
} int n, k;
ll ans, now=2, inv[N], fac[N], facInv[N];
inline ll C(int n, int m) {return fac[n]*facInv[m]%P*facInv[n-m]%P;}
inline void mod(ll &x) {if(x>=P) x-=P;}
int main() {
freopen("in","r",stdin);
n=read(); k=read();
inv[1]=1; fac[0]=facInv[0]=1;
for(int i=1; i<=n; i++) {
if(i!=1) inv[i] = (P-P/i)*inv[P%i]%P;
fac[i] = fac[i-1]*i%P;
facInv[i] = facInv[i-1]*inv[i]%P;
}
n -= k;
for(int i=n; i>=0; i--) {
(ans += ((i&1) ? -1 : 1) * C(n, i)*(now-1)%P) %=P;
now = now*now%P;
}
if(ans<P) ans+=P;
ans = ans*C(n+k, k)%P;
printf("%lld\n", ans);
}

BZOJ 2839: 集合计数 [容斥原理 组合]的更多相关文章

  1. bzoj 2839 : 集合计数 容斥原理

    因为要在n个里面选k个,所以我们先枚举选的是哪$k$个,方案数为$C_{n}^k$ 确定选哪k个之后就需要算出集合交集正为好这$k$个的方案数,考虑用容斥原理. 我们还剩下$n-k$个元素,交集至少为 ...

  2. BZOJ 2839: 集合计数 解题报告

    BZOJ 2839: 集合计数 Description 一个有\(N\)个元素的集合有\(2^N\)个不同子集(包含空集),现在要在这\(2^N\)个集合中取出若干集合(至少一个),使得 它们的交集的 ...

  3. Bzoj 2839 集合计数 题解

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

  4. ●BZOJ 2839 集合计数

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2839 题解: 容斥原理 真的是神题!!! 定义 f[k] 表示交集大小至少为 k时的方案数怎 ...

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

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

  6. bzoj 2839: 集合计数【容斥原理+组合数学】

    首先,考虑容斥,我们所要的答案是并集至少有\( k \)个数的方案数减去并集至少有\( k+1 \)个数的方案数加上并集至少有\( k \)个数的方案数-- 在n个数中选i个的方案数是\( C_{n} ...

  7. [BZOJ 2839]集合计数

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

  8. bzoj 2839 集合计数——二项式反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2839 设 \( g(i) \) 表示至少有 i 个, \( f(i) \) 表示恰好有 i ...

  9. bzoj 2839 集合计数 —— 二项式反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2839 设 \( f(i) \) 为至少 \( i \) 个选择,则 \( f(i) = C_ ...

随机推荐

  1. Developing Skills

    题目传送门:点击打开链接 #include <iostream> #include <cstdio> #include <cstdlib> #include < ...

  2. Spark应用_PageView_UserView_HotChannel

    Spark应用_PageView_UserView_HotChannel 一.PV 对某一个页面的访问量,在页面中进行刷新一次就是一次pv PV {p1, (u1,u2,u3,u1,u2,u4-)} ...

  3. 如何给网站添加CNZZ站长统计功能代码的常用办法

    前几天有个客户来问小编怎么给网站添加上CNZZ站长统计工具,其实这个很简单,只要把cnzz免费代码复制到我们的footer文件就行.今天小编正好有空就来分享一下具体的操作过程. 首先要想获得这个免费的 ...

  4. JavaScript之BST

    自己尝试用js实现了数据结构的二叉查找树. // node function Node(data) { this.data = data; this.lc = null; this.rc = null ...

  5. myeclipse 10怎么安装与激活

    http://jingyan.baidu.com/article/5553fa82eae0ce65a2393406.html

  6. 基础数据类型的补充和深浅copy

    一:关于str 的操作方法补充 1,s.isspace()   判断字符串是否只由空格组成,是,为True,否则,为False. s = ' ' #只能是以至少一个空格组成的字符串(全空格) prin ...

  7. es7重点笔记

    1,函数绑定运算符,用来取代call,apply,bind调用,写法:并排的双冒号(::),左边是对象,右边是函数 foo :: bar; // 等同于bar.bind(foo); 双冒号返回的还是原 ...

  8. WEB前端大神之路之基础篇

    CSS篇: 1.CSS权重: 不重复造轮子啦,直接传送门(CSS选择器的权重与优先规则) JavaScript篇: 1.this关键字: 它是一种引用(referent).指向的是当前上下文(cont ...

  9. Discuz论坛URL静态化规则urlrewrite

    http://blog.csdn.net/u014181418/article/details/53467980 1.在论坛代码目录下新建文件".htaccess" vim /us ...

  10. linux mysql下忘记root密码解决办法

    1 修改MySQL的登录设置 # vi /etc/my.cnf 在[mysqld]的中加上一句:skip-grant-tables  2 重新启动mysqld # /etc/init.d/mysqld ...