BZOJ2839:集合计数(容斥,组合数学)
Description
Input
Output
Sample Input
Sample Output
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:集合计数(容斥,组合数学)的更多相关文章
- bzoj2839: 集合计数 容斥+组合
2839: 集合计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 523 Solved: 287[Submit][Status][Discuss] ...
- BZOJ2839 集合计数 容斥
题目描述(权限题qwq) 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模100000000 ...
- bzoj 2839 集合计数 容斥\广义容斥
LINK:集合计数 容斥简单题 却引出我对广义容斥的深思. 一直以来我都不理解广义容斥是为什么 在什么情况下使用. 给一张图: 这张图想要表达的意思就是这道题目的意思 而求的东西也和题目一致. 特点: ...
- 2015 asia xian regional F Color (容斥 + 组合数学)
2015 asia xian regional F Color (容斥 + 组合数学) 题目链接http://codeforces.com/gym/100548/attachments Descrip ...
- [BZOJ2839]:集合计数(组合数学+容斥)
题目传送门 题目描述 .(是质数喔~) 输入格式 一行两个整数N,K. 输出格式 一行为答案. 样例 样例输入: 3 2 样例输出: 样例说明 假设原集合为{A,B,C} 则满足条件的方案为:{AB, ...
- bzoj2839 集合计数(容斥)
2839: 集合计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 883 Solved: 490[Submit][Status][Discuss] ...
- bzoj2839 集合计数(容斥+组合)
集合计数 内存限制:128 MiB 时间限制:1000 ms 标准输入输出 题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 ...
- BZOJ2839 : 集合计数 (广义容斥定理)
题目 一个有 \(N\) 个 元素的集合有 \(2^N\) 个不同子集(包含空集), 现在要在这 \(2^N\) 个集合中取出若干集合(至少一个), 使得它们的交集的元素个数为 \(K\) ,求取法的 ...
- bzoj2839 集合计数 组合计数 容斥原理|题解
集合计数 题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007.(是 ...
随机推荐
- SQL SERVER存储过程中使用事务
存储过程格式: CREATE PROCEDURE YourProcedure AS BEGIN SET NOCOUNT ON; BEGIN TRY---------------------开始捕捉异常 ...
- CSS学习笔记06 简单理解line-height
在制作页面的时候,经常会遇到文本图片需要居中的情况,这时候,只要设置下文本的line-height属性等于包裹该文本的元素的高度即可让文本居中显示了,先来看看这个现象. <!DOCTYPE ht ...
- Training little cats(poj3735,矩阵快速幂)
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10737 Accepted: ...
- Another kind of Fibonacci(矩阵)
Another kind of Fibonacci Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- Three.js开发指南---创建,加载高级网格和几何体(第八章)
本章的主要内容: 一, 通过Three.js自带的功能来组合和合并已有的几何体,创建出新的几何体 二, 从外部资源中加载网格和几何体 1 前面的章节中,我们学习到,一个几何体创建的网格,想使用多个材质 ...
- python学习之老男孩python全栈第九期_day009之文件操作总结
# 文件处理# 打开文件# open('路径','打开方式', '指定编码方式')# 打开方式:r w a 可读可写:r+ 可写可读:w+ 可追加可读:a+ b# r+ :打开文件直接写,和读完再写 ...
- linux下lamp环境修改网站根目录
Apache默认的网站目录是在/var/www/html,我们现在要把网站目录更改成 /var/www 目录下,操作如下: 1.修改httpd,conf文件 vi /etc/httpd/conf/ht ...
- PDO异常处理
PDO提供了三种处理错误的方式 PDO::ERRMODE_SILENT:静默模式(默认) PDO::ERRMODE_WARNING:警告模式 PDO::ERRMODE_EXCEPTION:异常模式 示 ...
- js-ES6学习笔记-对象的扩展
1.ES6允许直接写入变量和函数,作为对象的属性和方法.这种写法用于函数的返回值,将会非常方便.CommonJS模块输出变量,就非常合适使用简洁写法. var ms = {}; function ge ...
- 【代码笔记】iOS-在Block中修改外部变量值的
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...