bzoj 2839 集合计数 —— 二项式反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2839
设 \( f(i) \) 为至少 \( i \) 个选择,则 \( f(i) = C_{n}^{i} * (2^{2^{n-i}} - 1) \),因为其他可选可不选;
设 \( g(i) \) 为恰好 \( i \) 个选择,则 \( f(i) = \sum\limits_{j=i}^{n} g(j) * C_{j}^{i} \)
感觉形式不是一般那种,所以想换一下,设 \( f(i) \) 为至多 \( i \) 个不选,则 \( f(i) = C_{n}^{i} * (2^{2^{i}} - 1) \)
\( g(i) \) 为恰好 \( i \) 个不选,则 \( f(i) = \sum\limits_{j=0}^{i} g(j) * C_{i}^{j} \)
则 \( g(i) = \sum\limits_{j=0}^{i} (-1)^{i-j} * C_{i}^{j} * f(j) \)
然而这样求 \( g(n-k) = \sum\limits_{i=0}^{n-k} (-1)^{n-k-i} * C_{n-k}^{i} * f(i) \) 却不对...改成
\( g(n-k) = \sum\limits_{i=0}^{n-k} (-1)^{n-k-i} * C_{n-i}^{k} * f(i) \) 却对了...不明白啊...
后来知道上面那个形式也可以直接反演 \( g(i) = \sum\limits_{j=i}^{n} (-1)^{j-i} * C_{j}^{i} * f(j) \)
还是不明白那种做法,组合数为什么...
注意放在指数的数是对 mod-1 取模!
upt:如果 \( f(i) \) 是至多 \( i \) 个不选,那么 \( f(i) = \sum\limits_{j=0}^{i} C_{n-j}^{n-i} * g(j) \),而不是 \( C_{i}^{j} \)
因为“至多 \( i \) 个”,所以 \( i \) 是不确定的,而 \( n-i \) 确定必选,算方案的时候也是 \( f(i) = C_{n}^{i} * (2^{2^{i}}-1) \)
所以应该是在能确定的部分中进行选择,也就是 \( C_{n-j}^{n-i} \) !
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int const xn=1e6+,mod=1e9+;
int n,k,jc[xn],jcn[xn],f[xn];
ll pw(ll a,int b,int md){ll ret=; for(;b;b>>=,a=a*a%md)if(b&)ret=ret*a%md; return ret;}
int upt(int x){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
void init()
{
jc[]=;
for(int i=;i<=n;i++)jc[i]=(ll)jc[i-]*i%mod;
jcn[n]=pw(jc[n],mod-,mod);
for(int i=n-;i>=;i--)jcn[i]=(ll)jcn[i+]*(i+)%mod;
}
int C(int n,int m){return (ll)jc[n]*jcn[m]%mod*jcn[n-m]%mod;}
int main()
{
n=rd(); k=rd(); init();
for(int i=;i<=n;i++)f[i]=(ll)C(n,i)*(pw(,pw(,i,mod-),mod)-)%mod;//
int ans=;
for(int i=;i<=n-k;i++)ans=upt(ans+(ll)C(n-i,k)*f[i]*(((n-k-i)&)?-:)%mod);//C(n-k,i)?
/* //也可
for(int i=0;i<=n;i++)f[i]=(ll)C(n,i)*(pw(2,pw(2,n-i,mod-1),mod)-1)%mod;//
int ans=0;
for(int i=k,t=1;i<=n;i++,t=-t)ans=upt(ans+(ll)C(i,k)*f[i]*t%mod);
*/
printf("%d\n",ans);
return ;
}
bzoj 2839 集合计数 —— 二项式反演的更多相关文章
- BZOJ 2839: 集合计数(二项式反演)
		
传送门 解题思路 设\(f(k)\)为交集元素个数为\(k\)的方案数.发现我们并不能直接求出\(f(k)\),就考虑容斥之类的东西,容斥首先要扩大限制,再设\(g(k)\)表示至少有\(k\)个交集 ...
 - bzoj 2839 集合计数——二项式反演
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2839 设 \( g(i) \) 表示至少有 i 个, \( f(i) \) 表示恰好有 i ...
 - BZOJ 2839: 集合计数 解题报告
		
BZOJ 2839: 集合计数 Description 一个有\(N\)个元素的集合有\(2^N\)个不同子集(包含空集),现在要在这\(2^N\)个集合中取出若干集合(至少一个),使得 它们的交集的 ...
 - BZOJ 2839: 集合计数 [容斥原理 组合]
		
2839: 集合计数 题意:n个元素的集合,选出若干子集使得交集大小为k,求方案数 先选出k个\(\binom{n}{k}\),剩下选出一些集合交集为空集 考虑容斥 \[ 交集为\emptyset = ...
 - Bzoj 2839 集合计数 题解
		
2839: 集合计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 495 Solved: 271[Submit][Status][Discuss] ...
 - BZOJ2839 集合计数  二项式反演
		
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2839 题解 二项式反演板子题. 类似于一般的容斥,我们发现恰好 \(k\) 个不怎么好求,但是 ...
 - bzoj 2839 集合计数 容斥\广义容斥
		
LINK:集合计数 容斥简单题 却引出我对广义容斥的深思. 一直以来我都不理解广义容斥是为什么 在什么情况下使用. 给一张图: 这张图想要表达的意思就是这道题目的意思 而求的东西也和题目一致. 特点: ...
 - ●BZOJ 2839 集合计数
		
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2839 题解: 容斥原理 真的是神题!!! 定义 f[k] 表示交集大小至少为 k时的方案数怎 ...
 - BZOJ 2839: 集合计数 广义容斥
		
在一个 $N$ 个元素集合中的所有子集中选择若干个,且交集大小为 $k$ 的方案数. 按照之前的套路,令 $f[k]$ 表示钦定交集大小为 $k$,其余随便选的方案数. 令 $g[k]$ 表示交集恰好 ...
 
随机推荐
- 建议37:按需选择sort或sorted
			
# -*- coding:utf-8 -*- ''' 用法: sorted(iterable[, cmp[, key[, reverse]]]) s.sort([cmp[, key[, reverse ...
 - Cocos2d-x项目移植到WP8系列之二:开篇
			
原文链接: http://www.cnblogs.com/zouzf/p/3970130.html 开发环境一笔带过吧,主板和CPU要支持虚拟化技术,要开启才行,装个64位win8.1系统,win8不 ...
 - Cocos2d-x项目移植到WP8系列之一:前传
			
原文链接: http://www.cnblogs.com/zouzf/p/3969993.html 许久没动笔了,随想一直都有动笔的想法,但拖来拖去,归根到底还是一个懒字吧 .发现人的惰性真是太强大了 ...
 - oracle 字典表查询
			
1.oracle 字典表查询 /*显示当前用户*/ show user 在sql plus中可用,在pl sql中不可用 /*查看所有用户名*/ select username,user_id,cre ...
 - RedisDesktopManager连接不上redis的解决方法
			
RedisDesktopManager是一款连接redis数据库的客户端. 背景:我是在自己机器上装的redis,使用的是虚拟机,系统是linux 版本是centeros-6.7 在使用这个连接red ...
 - sg函数的应用
			
刚刚接触到sg函数突然感觉到原来可以这么好用,sg函数应该算是博弈论中比较经典的东西了.下面来说说sg函数: 从网上搜集资料终于能看懂了下面解释来自http://www.cnblogs.com/cj6 ...
 - UvaLive 5811 概率DP
			
题意 : 有54张牌 问抽多少张牌能使每种花色都至少是给定的数字 两张王牌可以被选择为任何花色 高放学长真是太腻害辣! 设置dp[][][][][x][y] 前四维代表四种真的花色的数量 后两维xy代 ...
 - hdu 5884 Sort 队列+多叉哈夫曼树
			
Sort Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Des ...
 - matplotlib两种画散点图的方式
			
对于matplotlib.pyplot( as plt ) 先输入主体数据部分: import numpy as np import matplotlib.pyplot as plt X_train ...
 - Windows 运行中的命令
			
辅助功能选项 access.cpl 添加硬件向导 hdwwiz.cpl 添加或删除程序 appwiz.cpl 管理工具 control admintools 自动更新 wuaucpl.cpl Blue ...