bzoj 2839: 集合计数 (容斥原理)
来源:互联网 发布:天刀公子羽捏脸数据 编辑:程序博客网 时间:2024/04/29 04:32
题目描述
传送门
题目大意:
一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数
题解
首先我们 考虑确认出交集中的K个元素,选择的方案数是
但是我们选取出的子集的交集至少为k的,那么需要容斥原理来计算。根据找规律的容斥的系数是
代码
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define p 1000000007#define LL long long #define N 1000003using namespace std;LL jc[N],inv[N],mi[N*3];int n,k;LL quickpow(LL num,int x,LL p1){ if (x<=3000000&&p1==p) return mi[x]; LL base=num%p; LL ans=1; while (x) { if (x&1) ans=ans*base%p1; x>>=1; base=base*base%p1; } return ans;}LL C(int n,int m){ return jc[n]*inv[m]%p*inv[n-m]%p;}int main(){ scanf("%d%d",&n,&k); jc[0]=1; mi[0]=1; for (int i=1;i<=n;i++) jc[i]=jc[i-1]*i%p; for (int i=0;i<=n;i++) inv[i]=quickpow(jc[i],p-2,p); for (int i=1;i<=3000000;i++) mi[i]=mi[i-1]*2%p; LL ans=0; int t; for (int i=k;i<=n;i++) { if ((i-k)&1) t=-1; else t=1; LL cnt=quickpow(2,n-i,p-1); ans+=C(n,i)*C(i,k)%p*(quickpow(2,cnt,p)-1)%p*t; ans%=p; //cout<<ans<<endl; } printf("%lld\n",(ans%p+p)%p);}
0 0
- BZOJ 2839 集合计数 容斥原理
- [容斥原理] BZOJ 2839 集合计数
- [容斥原理]BZOJ 2839: 集合计数
- bzoj 2839: 集合计数 (容斥原理)
- bzoj 2839: 集合计数 排列组合+容斥原理
- BZOJ 2839: 集合计数 容斥原理 组合数学
- 容斥原理 集合计数
- [BZOJ2839]集合计数(容斥原理+组合数学)
- bzoj2839 集合计数 (容斥原理+组合数)
- 【BZOJ2839】集合计数,容斥原理
- bzoj2839集合计数 容斥原理
- BZOJ 2839 浅谈容斥原理组合计数及欧拉定理优化二维幂指数
- bzoj 2839 集合计数
- BZOJ 2839 集合计数
- bzoj 2839 集合计数
- [DP][容斥原理] BZOJ 4762: 最小集合
- 【bzoj】2190 - 仪仗队(容斥原理)
- bzoj 2393(容斥原理)
- java8 lambda表达式
- @RequestMapping注解
- 网络协议常用端口
- 物体检测--HOG特征
- Vue.js学习系列(四十一)-- 修饰符(二)
- bzoj 2839: 集合计数 (容斥原理)
- vim常用命令总结
- 数据结构和算法[精选]
- @RequestMapping和RequestParam注解的使用
- Python打印乘法口诀表
- c++ 之详述继承篇
- [BZOJ2986]Non-Squarefree Numbers(二分+容斥原理)
- oracle数据库sql基础
- Douglas-Peucker算法理解