bzoj 3622 已经没有什么好害怕的了——二项式反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3622
令 f[i] 表示钦定 i 对 a[ ]>b[ ] 的关系的方案数;g[i] 表示恰好 i 对 a[ ]>b[ ] 的关系的方案数。
那么 \(f[i]=\sum\limits_{j>=i}C_{j}^{i}*g[j] \) ,\(g[i]=\sum\limits_{j>=i}C_{j}^{i}f[j](-1)^{j-i} \)
考虑怎么求 f[ ] 。可以 DP 。
先把 a[ ] 和 b[ ] 都按从小到大的顺序排序,dp[i][j]表示前 i 个 a[ ] 匹配了 j 对 a[ ] > b[ ] 的关系的方案数。
排序的好处就是 a[ ] > b[ ] 的一段 b[ ] ,a[i] 的这一段能包含 a[i-1] 的这一段。所以转移就是 dp[i][j]=dp[i-1][j]+dp[i-1][j-1]*(p0-(j-1)),其中p0是比 a[i] 小的 b[ ] 的个数。
然后别忘了 f[ i ] = dp[n][i]*(n-i)! ,阶乘表示其他配对可以随意。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int Mn(int a,int b){return a<b?a:b;}
const int N=,mod=1e9+;
int upt(int x){if(x>=mod)x-=mod;return x;}
int n,k,a[N],b[N],dp[N],c[N][N];
void init()
{
for(int i=;i<=n;i++)c[i][]=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
c[i][j]=upt(c[i-][j]+c[i-][j-]);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=n;i++)scanf("%d",&b[i]);
k+=n;if(k&){puts("");return ;}//
k>>=;
sort(a+,a+n+); sort(b+,b+n+);
int p0=;dp[]=;
for(int i=;i<=n;i++)
{
while(p0<n&&b[p0+]<a[i])p0++;
for(int j=Mn(i,p0);j;j--)
dp[j]=(dp[j]+(ll)dp[j-]*(p0-j+))%mod;
}
for(int i=n,lj=,j=;i;i--,j++,lj=(ll)lj*j%mod)
dp[i]=(ll)dp[i]*lj%mod;
int ans=; init();
for(int i=k,j=;i<=n;i++,j=-j)
ans=(ans+(ll)dp[i]*j*c[i][k])%mod;
if(ans<)ans+=mod; printf("%d\n",ans);
return ;
}
bzoj 3622 已经没有什么好害怕的了——二项式反演的更多相关文章
- BZOJ 3622: 已经没有什么好害怕的了(二项式反演)
传送门 解题思路 首先将\(a\),\(b\)排序,然后可以算出\(t(i)\),表示\(a(i)\)比多少个\(b(i)\)大,根据容斥套路,设\(f(k)\)表示恰好有\(k\)个\(a(i)\) ...
- luoguP4859 已经没有什么好害怕的了(二项式反演)
luoguP4859 已经没有什么好害怕的了(二项式反演) 祭奠天国的bzoj. luogu 题解时间 先特判 $ n - k $ 为奇数无解. 为了方便下记 $ m = ( n + k ) / 2 ...
- BZOJ 3622: 已经没有什么好害怕的了 [容斥原理 DP]
3622: 已经没有什么好害怕的了 题意:和我签订契约,成为魔法少女吧 真·题意:零食魔女夏洛特的结界里有糖果a和药片b各n个,两两配对,a>b的配对比b>a的配对多k个学姐就可能获胜,求 ...
- bzoj 3622 已经没有什么好害怕的了 类似容斥,dp
3622: 已经没有什么好害怕的了 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1213 Solved: 576[Submit][Status][ ...
- BZOJ 3622 : 已经没有什么好害怕的了(dp + 广义容斥原理)
今天没听懂 h10 的讲课 但已经没有什么好害怕的了 题意 给你两个序列 \(a,b\) 每个序列共 \(n\) 个数 , 数之间两两不同 问 \(a\) 与 \(b\) 之间有多少配对方案 使得 \ ...
- BZOJ3622 已经没有什么好害怕的了 二项式反演+DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3622 题解 首先显然如果 \(n - k\) 为奇数那么就是无解.否则的话,"糖果& ...
- [BZOJ 3622]已经没有什么好害怕的了
世萌萌王都拿到了,已经没有什么好害怕的了—— (作死) 笑看哪里都有学姐,真是不知说什么好喵~ 话说此题是不是输 0 能骗不少分啊,不然若学姐赢了,那么有头的学姐还能叫学姐吗? (作大死) 这 ...
- ●BZOJ 3622 已经没有什么好害怕的了
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3622 题解: 容斥,dp1).可以求出需要多少对"糖果>药片"(K ...
- 解题:BZOJ 3622 已经没有什么好害怕的了·
题面 用来学习二项式反演的题目 大于等于/小于等于 反演出 恰好等于 设前者为f(n),后者为g(n),则有$f(n)=\sum\limits_{i=0}^nC_n^ig(n)<->g(n ...
随机推荐
- (转)使用UTL_SMTP包发送邮件
使用UTL_SMTP包发送邮件 参考文档 Email From Oracle PL/SQL (UTL_SMTP) UTL_SMTP Oracle 存储过程中发送邮件,并支持用户验证.中文标题和内容
- (转)RocketMQ源码学习--消息存储篇
http://www.tuicool.com/articles/umQfMzA 1.序言 今天来和大家探讨一下RocketMQ在消息存储方面所作出的努力,在介绍RocketMQ的存储模型之前,可以先探 ...
- golang channel本质——共享内存
channel是golang中很重要的概念,配合goroutine是golang能够方便实现并发编程的关键.channel其实就是传统语言的阻塞消息队列,可以用来做不同goroutine之间的消息传递 ...
- powerDesigner16x64安装步骤
PowerDesigner16x64_Evaluation安装 补一下 安装成功
- visual Studio里面的代码前面多出好多小点应该怎么设置
如果是vs中前面绿色的点的话你试试 ctrl + R 然后 ctrl + W 试试看能不能去掉
- (转载)hibernate缓存
目的:减少访问数据库的次数 一级缓存(默认): Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session(一定要同一个sessi ...
- SharePoint 2013的100个新功能之内容管理(四)
一:脚本编辑器Web部件 新的脚本编辑器Web部件表现为插入标签页下的Ribbon中的"嵌入的代码",可以使用户在SharePoint网站页面中添加HTML或Javascript或 ...
- 2019.1.3 WLAN 802.11 a/b/g PHY Specification and EDVT Measurement I - Transmit Power Level
This lecture provides the WLAN hardware engineer the essential knowledge of IEEE 802.11 a/b/g physic ...
- SHA1
整理于互动百科 安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital ...
- SWIFT推送之本地推送(UILocalNotification)
本地推送通知是通过实例化UILocalNotification实现的.要实现本地化推送可以在AppDelegate.swift中添加代码实现,本事例是一个当App进入后台时推送一条消息给用户. 1.首 ...