【arc093f】Dark Horse(容斥原理,动态规划,状态压缩)
【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;
}
												
											【arc093f】Dark Horse(容斥原理,动态规划,状态压缩)的更多相关文章
- ARC093F Dark Horse 容斥原理+DP
		
题目传送门 https://atcoder.jp/contests/arc093/tasks/arc093_d 题解 由于不论 \(1\) 在哪个位置,一轮轮下来,基本上过程都是相似的,所以不妨假设 ...
 - [动态规划]状态压缩DP小结
		
1.小技巧 枚举集合S的子集:for(int i = S; i > 0; i=(i-1)&S) 枚举包含S的集合:for(int i = S; i < (1<<n); ...
 - [POJ 2923] Relocation (动态规划 状态压缩)
		
题目链接:http://poj.org/problem?id=2923 题目的大概意思是,有两辆车a和b,a车的最大承重为A,b车的最大承重为B.有n个家具需要从一个地方搬运到另一个地方,两辆车同时开 ...
 - POJ 1185 炮兵阵地(动态规划+状态压缩)
		
炮兵阵地 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原( ...
 - ACM学习历程—HDU1584 蜘蛛牌(动态规划 && 状态压缩 || 区间DP)
		
Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起 ...
 - HDOJ-1074(动态规划+状态压缩)
		
Doing Homework HDOJ-1074 1.本题主要用的是状态压缩的方法,将每种状态用二进制压缩表示 2.状态转移方程:dp[i|(1<<j)]=min(dp[i|(1<& ...
 - [ZOJ 3662] Math Magic (动态规划+状态压缩)
		
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3662 之前写过这道题,结果被康神吐槽说代码写的挫. 的确,那时候 ...
 - 动态规划状态压缩-poj1143
		
题目链接:http://poj.org/problem?id=1143 题目描述: 代码实现: #include <iostream> #include <string.h> ...
 - [AtCoder ARC093F]Dark Horse
		
题目大意:有$2^n$个人,每相邻的两个人比赛一次.令两个人的编号为$a,b(a\leqslant b)$,若$a\neq 1$,则$a$的人获胜:否则若$b\in S$则$b$获胜,不然$1$获胜. ...
 - 3.4 熟练掌握动态规划——状态压缩DP
		
从旅行商问题说起—— 给定一个图,n个节点(n<=15),求从a节点出发,经历每个节点仅一次,最后回到a,需要的最短时间. 分析: 设定状态S代表当前已经走过的城市的集合,显然,S<=(1 ...
 
随机推荐
- MySQL学习笔记04 插入中文时出现ERROR 1366 (HY000)
			
1 环境: MySQL Server 6.0 命令行工具 2 问题 : 插入中文字符数据出现如下错误: ERROR 1366 (HY000): Incorrect string value: '\ ...
 - MariaDB数据库性能优化
			
1. 硬件优化 1.1 内存(Memory) 内存是最重要的因素,因为它允许您调整服务器系统变量.更多的内存意味着可以将更大的密钥和表缓存存储在内存中,从而减少磁盘访问速度,降低一个数量级. 如果未将 ...
 - 20155227《网络对抗》Exp5 MSF基础应用
			
20155227<网络对抗>Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode exploit:把实现设置好的东西送到要攻击的主机里. ...
 - 20155234 《网络对抗》Exp 8 Web基础
			
基础问答 什么是表单 可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 表单包括两个部分:一部分是HTML源代码用于描述表单(例如,域,标签和用户在页面上看见的按钮),另一部分是脚本 ...
 - Exp1 PC平台逆向破解(5)M
			
Exp1 PC平台逆向破解(5)M [ 直接修改程序机器指令,改变程序执行流程] 用命令cp pwn1 20155320备份pwn1 输入objdump -d 20155320反汇编,找到call指令 ...
 - 汇编  shr 逻辑右移指令,shl 逻辑左移指令,SAL 算术左移指令,SAR 算术右移指令
			
知识点: shr 逻辑右移指令 shl 逻辑左移指令 一.SHL 逻辑左移指令测试 shr 逻辑右移指令 右移一位相当于整除2 shl 逻辑左移指令 左移一位相当于乘2 //很多时候会溢出 //& ...
 - 蓝牙inquiry流程之HCI_Inquiry_Result_With_RSSI和HCI Extended Inquiry Result处理
			
首先介绍一下和inquiry的相关的流程. inquiry是从协议栈下发的一个HCI命令.其格式如下: 这里简单介绍下第二个参数,是inquiry的持续时间, 从上图看出 inquiry持续的时间是 ...
 - .Net-C#异步程序知识点梳理
			
:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...
 - 激活IntelliJ IDEA到2100年
			
1.下载破解文件(破解版本2018.2,其他版本未尝试) http://idea.lanyus.com/jar/JetbrainsIdesCrack-4.2-release-sha1-3323d5d0 ...
 - Github pages + Minimal-Mistakes + Disqus建立个人博客记录
			
本文详细记录了利用Github pages建立个人博客的步骤. github pages官方推荐使用Jekyll生成静态网页,jekyll支持各种不同的主题,Minimal-Mistakes是一个功能 ...