心路:

{

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

然后再想怎么求至少含k个的方案数想到了让集合含这k个数然后随机组就行,但没有想出来怎么求含这k个数的集合数,而且就算求出来发现不能直接对一种情况乘,有重复计算的...

想到这...再想...再想...放弃->颓题解。T_T
颓完题解,发现我是把题目信息忽略了...2^n没怎么用上;

}

题解

{

  往容斥上想,容斥的一般思路就是先找出单一满足的,把问题简单化(让其限制变小),再逐步用容斥求解。

这题总思路就是先找至少含k个的(限制变少,能够推式),再容斥。

再求至少含k个的时候,容易发现想要交出含这k个的,让集合含这k个数在随机组合一定能交出来.

问题来了:怎么求含特定k个数的集合总数呢?

把这k个数提取出来剩下的数随机组,能够组成的集合在把k个数补回去不就是答案吗,所以有2^(n-k)种(含空集,实际指的是正好只含这K个数的集合),在让这几个集合随机组一定是满足能交成至少含k个数的方案。注意空集不是,所以是2^( 2^(n-k) )-1种。

举个栗子:数据是4 2

以1,3为例,把1 3提取,剩下的数所组是{2},{4},{2,4},{空},其实就是{1,2,3},{1,3,4},{1,2,3,4},{1,3};这四个集合在随机组成的方案中,空集相当于哪个集合都没取交集为空所以不符合。

求出1,3后乘上C(n,2)不就是交出来至少含k个的方案数了吗?显然不是,,,有重复的啊

比如1,3会求到{1,2,3,4}交{1,3,4},而1,4..3,4也会(当时我就这崩了...)

看重复的有多少啊->对于求k个时交出来是k+1个的会算C(k+1,k)遍以此类推..所以在容斥时只要把重复的倍数减去就行。

设f(k)=C(n,k)*(  2^( 2^(n-k) )-1 ),

答案就是f(k)*C(K,K)-C(K+1,K)*f(k+1)+C(k+2,k)*f(k+2)...;

预处理阶乘和逆元,2^...这里也要预处理不然会WA(我也不知道为哈用快速幂求出的大数据就是不对)。

2^(2^(n-k))=( 2^(2^(n-k-1)) )^2,利用这个性质倒推预处理出来就行了

f(k)∗Ckk−f(k+1)∗Ckk+1+f(k+2)∗Ckk+2...f(n)∗Ckn

}

#include<cstdio>
#include<iostream>
using namespace std;
#define ll long long
const int mod=1e9+7;
const int maxn=1000010;
int n,k;
ll ans,f[maxn];
ll fac[maxn],inv[maxn],qtwo[maxn];
ll qpow(ll a,int b)
{ll ans=1;while(b){if(b&1) ans=ans*a%mod;b>>=1;a=a*a%mod;}return ans;
}
void init()
{fac[0]=1;for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;inv[n]=qpow(fac[n],mod-2);for(int i=n-1;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod;qtwo[n]=2;for(int i=n-1;i>=0;i--) qtwo[i]=qtwo[i+1]*qtwo[i+1]%mod;
}
void F(int x)
{ll turn,kp;turn=qtwo[x]-1;f[x]=fac[n]*inv[x]%mod*inv[n-x]%mod*turn%mod;
}
void rongchi()
{for(int i=k;i<=n;i+=2) ans=(ans+ fac[i]*inv[k]%mod*inv[i-k]%mod*f[i]%mod )%mod;for(int i=k+1;i<=n;i+=2) ans=(ans+mod- fac[i]*inv[k]%mod*inv[i-k]%mod*f[i]%mod )%mod;
}
int main()
{
//freopen("c.out","w",stdout);scanf("%d%d",&n,&k);init();for(int i=k;i<=n;i++) F(i);rongchi();printf("%lld",ans);
}

View Code

转载于:https://www.cnblogs.com/three-D/p/11138164.html

集合计数 (容斥原理)相关推荐

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

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

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

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

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

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

  4. [BZOJ2839]集合计数(容斥原理+组合数学)

    题目描述 传送门 题解 首先考虑固定k个元素,方案为 Ckn C_n^k 还剩下 2n−k 2^{n-k}个集合,可以任选若干个集合 C12n−k+C22n−k+..+C2n−k2n−k=22n−k ...

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

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

  6. [bzoj2893] 集合计数

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

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

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

  8. [BZOJ 2839] 集合计数

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

  9. [BZOJ 2839]集合计数

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

最新文章

  1. Oracle查询忽略大小写的实现方法
  2. Django框架之DRF get post put delete 使用简单示例 (利用序列化反序列化)
  3. JAVA之获取JavaSwing单选框JRadioButton选中的值(内容)
  4. 这5种员工,千万不能重用
  5. android x86_64 服务器运行,魔趣 android10 编译x86-64 运行模拟器
  6. F2工作流引擎之-纯JS Web在线可拖拽的流程设计器(八)
  7. fastadmin token 验证错误_用签名保护你的隐私(4)--token生成
  8. 【Flink】Flink启动报错 BindException: Could not start rest endpoint on any port in port range 7089
  9. Integer转BigDecimal
  10. xaml mvvm(1)之结构
  11. 吾智商低,对于VS的char实在是不知所云
  12. 10部程序员必看的纪录片
  13. 汽车故障检测仪计算机教程,道通MS诊断仪在线编程刷隐藏908SPRO汽车故障检测电脑...
  14. 吴军,阅读与写作,11,写景:如何寓情于景?
  15. 键盘数字测试软件,KeyboardTest(键盘测试工具)官方版
  16. Java实现最近点问题
  17. linux刷新屏幕命令是什么,linux重启刷新桌面方法教程
  18. 5福最多多少钱_2018支付宝集5福攻略介绍 一天内集齐不是没可能
  19. 流媒体服务器,red5,EsayDSS,AdobeMediaServer5和阿里推流服务性能对比。flash播放器JWplayer CKplayers Aliplayer性能对比
  20. Python opencv:人眼/人脸识别并实时打码处理

热门文章

  1. 【 Grey Hack 】综合工具 shellOs
  2. Workbox.routing v3.x 中文版
  3. Python 函数装饰器
  4. VC程序员常用工具篇
  5. Mac下安装event库
  6. 文件指针和文件描述符之间的相互转换 fd----fp 和 fp----fd
  7. Gvim 字体大小设置和FencView插件安装
  8. CPUID详解[增加TLB与Cache]
  9. 数万字的0基础React知识大纲一定要藏藏好
  10. [html] 你是如何理解html与css分离的?