【arc093f】Dark Horse(容斥原理,动态规划,状态压缩)

题面

atcoder
有 \(2^n\) 名选手,编号为 \(1\) 至 \(2^n\) 。现在这 \(2^n\) 名选手将进行 \(n\) 轮淘汰赛,决出胜者。若 \(x<y\) ,则 \(x\) 能够战胜 \(y\) 。但有 \(m\) 个例外,\(1\) 号选手会输给这 \(m\) 个选手。问有多少中排列方式使得\(1\)号选手取得胜利。\(n,m≤16\)。
(这是肖大佬的翻译)

题解

钦定\(1\)号站在一号位置(这个无所谓吧),剩下的第\(i\)个位置站的人是\(p_i\),那么首先\(1\)会和\(p_2\)打,然后和\(min(p_3,p_4)\),接下来是\(min(p_5,p_6,p_7,p_8)\),以此类推下去。
我们的方案数等于上述\(n\)个集合中每个集合的最小值都不是给定的\(m\)个人。
直接算不好搞,容斥考虑。钦定哪些块的最小值一定是给定的\(m\)个人,那么假设给这\(n\)个区间的人,也就是把这\(n\)块编号然后状压一下,那么方案数定义为\(f(S)\),那么最终的答案就是\(\sum (-1)^{|S|}f(S)\)。

至于这个\(f(S)\)怎么求?我们把所有数从大往小排序,考虑\(dp\),设\(f[i][S]\)表示最大的\(i\)个标号的人中,\(S\)所代表的子集所包含的区间中的最小值是给定的\(m\)个人中的一个。转移的话首先是这个人不放入任何一个集合中。另外是构成一个集合的最小值,枚举一下构成哪个集合,然后用组合数算一下方案数即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MOD 1000000007
#define MAX 17
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
int bin[MAX],jc[1<<MAX],inv[1<<MAX],jv[1<<MAX];
int C(int n,int m){if(n<m)return 0;return 1ll*jc[n]*jv[m]%MOD*jv[n-m]%MOD;}
int a[MAX],n,m,ans,f[MAX+1][1<<MAX],cnt[1<<MAX];
int main()
{n=read();m=read();cnt[0]=jc[0]=bin[0]=jv[0]=inv[0]=inv[1]=1;for(int i=1;i<=n;++i)bin[i]=bin[i-1]<<1;for(int i=1;i<=bin[n];++i)jc[i]=1ll*jc[i-1]*i%MOD;for(int i=2;i<=bin[n];++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;for(int i=1;i<=bin[n];++i)jv[i]=1ll*jv[i-1]*inv[i]%MOD;for(int i=1;i<=bin[n];++i)cnt[i]=(i&1)?MOD-cnt[i>>1]:cnt[i>>1];for(int i=1;i<=m;++i)a[i]=read();sort(&a[1],&a[m+1]);f[m+1][0]=1;for(int i=m;i;--i)for(int t=0;t<bin[n];++t)if(f[i+1][t]){add(f[i][t],f[i+1][t]);int p=bin[n]-1-t;for(int j=0;j<n;++j)if(!(t&(1<<j)))add(f[i][t|(1<<j)],1ll*C(p-a[i]+1,(1<<j)-1)*f[i+1][t]%MOD*jc[1<<j]%MOD);}for(int i=0;i<bin[n];++i)add(ans,1ll*f[1][i]*jc[bin[n]-1-i]%MOD*cnt[i]%MOD);ans=1ll*ans*bin[n]%MOD;printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/9707441.html

【arc093f】Dark Horse(容斥原理,动态规划,状态压缩)相关推荐

  1. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

  2. 动态规划+状态压缩思路解决旅行者问题

    问题描述 小明目前在做一份毕业旅行的规划.打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次.由于经费有限,希望能够通过合理的路线安排尽可能的省一些路上的花销 ...

  3. 动态规划——状态压缩dp

    文章目录 概述 状态压缩 使用条件 状压dp 位运算 棋盘(基于连通性)类问题 概述 例题 蒙德里安的梦想 小国王 玉米田 炮兵阵地 集合类问题 概述 例题 最短Hamilton路径 愤怒的小鸟 总结 ...

  4. 由NP完全问题引出动态规划——状态压缩DP

    " 所有部分都应当在非强制的情况下组合回一起.要记住,你重组的那部分原来就是你拆解的.因此,如果你不能让它们组合回来的话,那一定是有原因的.要想尽一切办法,除了用锤头." – IB ...

  5. POJ-1185 炮兵阵地 动态规划+状态压缩

    由于递推的时候依赖于三个连续层的关系.一开始想着直接三重for循环,但是这里有个问题就是上一层的0位置上包括着上上层是0和1两种可能,而后者又对当前行有约束,因此该方法不行.当然有一个办法就是增加状态 ...

  6. POJ 1185 炮兵阵地(动态规划+状态压缩)

    炮兵阵地 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原( ...

  7. sdoi2009 [动态规划 状态压缩DP] 学校食堂

    背景 飘逸的EWF组合~ 描述 小F的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味 ...

  8. 第一章 动态规划 状态压缩DP

    1.基本概述 状态压缩dp和状态机一样,都是一种特殊的状态表示方式.状态机用一系列小状态表示某一状态.状态压缩dp用二进制数进行表示.虽然看代码起来时间复杂度比较高,但是很多的情况都给剪枝掉了. 状态 ...

  9. 动态规划-状态压缩DP

    [SCOI2005] 互不侵犯 题目描述 https://www.luogu.com.cn/problem/P1896 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它 ...

  10. HDU 3091(动态规划-状态压缩)

    问题描述: One day , Partychen gets several beads , he wants to make these beads a necklace . But not eve ...

最新文章

  1. 爬虫之xml和html的区别
  2. python 微信爬虫_python3简单实现微信爬虫
  3. keepalived(9)——sorry_server
  4. JMeter学习(四)参数化、断言、集合点
  5. k8s traefik 映射外部服务,映射其他域名,映射内网其他服务
  6. 改MD5防止你的视频被百度云秒和谐
  7. 如何优雅地下载PDF格式知网硕博论文?
  8. 面试IT公司的时候,程序员的简历应该写多少个项目经验比较合适?
  9. 游戏策划试题(1)——摘自牛客网
  10. mingw32-make[1]: *** [debug/qrc_resource.cpp] Error 1
  11. Either health or status endpoint must be enabled,
  12. 查看linux系统CPU内存
  13. 智力问答选择题_智力问答题库(全)
  14. ArcMap通过服务定义发布服务
  15. 英语学习网站php,英语学习网站
  16. WPS批量设置及批量打印文档
  17. 学习微信小程序开发文档总结
  18. 《我和这个世界不熟》——北岛
  19. 马云鹤无偿献血30年,用热血传递生命温情
  20. 布隆过滤器 (java)

热门文章

  1. scala linearization
  2. 支付宝福利:银行卡信息查询
  3. 苹果官方付费升级内存_vivo推出内存扩容服务:良心还是坑钱?
  4. Tensorflow2.0.0 GPU版本避坑安装+全套资源链接
  5. 微信小程序赋能会员管理和会员营销互动
  6. java和ssm开发的医院体检预约系统有论文
  7. 【PS专题】PS钢笔压力有感叹号怎么消除
  8. linux挂载镜像iso文件作为yum源
  9. CLEAR: Contrastive Learning for Sentence Representation
  10. in作为介词的用法_英语介词丨in、on 、at 的具体用法到底有哪些?