题目大意:有$2^n$个人,每相邻的两个人比赛一次。令两个人的编号为$a,b(a\leqslant b)$,若$a\neq 1$,则$a$的人获胜;否则若$b\in S$则$b$获胜,不然$1$获胜。钦定$1$获胜,问可以的开始的顺序的方案数

题解:状压$DP$,令开始的第$i$位的人的编号为$p_i$,发现到只有$\min\limits_{i\in[2^{j-1}+1,2^j]}\{p_i\}(1\leqslant j\leqslant n)$的人会和$1$打,考虑容斥,令$f_{i,j}$为到了要放$S$中的第$i$个人,现在第$k$个段($[2^{k-1}+1,2^k]$)中的最小值在$S$中的状态为$1<<k \& j$,时可以战胜$1$的方案数。(发现一个很优美的东西,$j==已经放置的人数$)

卡点:

C++ Code:

#include <cstdio>
#define N 1 << 16 | 3
const int mod = 1000000007;
int n, m, s[20];
long long fac[N], inv[N];
long long f[17][N], ans, U;
void update(long long &x, long long y) {if ((x += y) >= mod) x -= mod;}
long long C(long long a, long long b) {
if (a < b) return 0;
return fac[a] * inv[b] % mod * inv[a - b] % mod;
}
int main () {
scanf("%d%d", &n, &m); U = 1 << n;
for (int i = 1; i <= m; i++) scanf("%d", s + m - i);
fac[0] = fac[1] = inv[0] = inv[1] = 1;
for (int i = 2; i < U; i++) {
fac[i] = fac[i - 1] * i % mod;
inv[i] = inv[mod % i] * (mod - mod / i) % mod;
}
for (int i = 2; i < U; i++) inv[i] = inv[i - 1] * inv[i] % mod;
f[0][0] = 1;
for (int i = 0; i < m; i++) {
for (int j = 0; j < U; j++) {
update(f[i + 1][j], f[i][j]);
for (int k = 0; k < n; k++) {
if (!(j & (1 << k))) update(f[i + 1][j | 1 << k], f[i][j] * fac[1 << k] % mod * C(U - j - s[i], (1 << k) - 1) % mod);
}
}
}
for (int i = 0; i < U; i++) {
long long tmp = f[m][i] * fac[U - i - 1] % mod;
update(ans, __builtin_parity(i) ? (mod - tmp) : tmp);
}
printf("%lld\n", ans * U % mod);
return 0;
}

[AtCoder ARC093F]Dark Horse的更多相关文章

  1. ARC093F Dark Horse 容斥原理+DP

    题目传送门 https://atcoder.jp/contests/arc093/tasks/arc093_d 题解 由于不论 \(1\) 在哪个位置,一轮轮下来,基本上过程都是相似的,所以不妨假设 ...

  2. arc093F Dark Horse

    我们可以假设1的位置在1,并且依次与右边的区间合并.答案最后乘上2^n即可. 那么需要考虑1所在的区间与另一个区间合并时,另一个区间的最小值不能为特殊的. 直接求解很难,考虑容斥,钦定在哪几个位置必定 ...

  3. ARC093F Dark Horse 【容斥,状压dp】

    题目链接:gfoj 神仙计数题. 可以转化为求\(p_1,p_2,\ldots,p_{2^n}\),使得\(b_i=\min\limits_{j=2^i+1}^{2^{i+1}}p_j\)都不属于\( ...

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

    [arc093f]Dark Horse(容斥原理,动态规划,状态压缩) 题面 atcoder 有 \(2^n\) 名选手,编号为 \(1\) 至 \(2^n\) .现在这 \(2^n\) 名选手将进行 ...

  5. ARC 093 F Dark Horse 容斥 状压dp 组合计数

    LINK:Dark Horse 首先考虑1所在位置. 假设1所在位置在1号点 对于此时剩下的其他点的方案来说. 把1移到另外一个点 对于刚才的所有方案来说 相对位置不变是另外的方案. 可以得到 1在任 ...

  6. Atcoder Regular Contest 093 D - Dark Horse(组合数学+状压 dp)

    Atcoder 题面传送门 & 洛谷题面传送门 常规题,简单写写罢((( 首先 \(1\) 的位置是什么不重要,我们不妨钦定 \(1\) 号选手最初就处在 \(1\) 号位置,最后答案乘个 \ ...

  7. ARC093 F - Dark Horse

    https://atcoder.jp/contests/arc093/tasks/arc093_d 题解 先钦定\(1\)号站在第一个位置上,那么他第一轮要和\((2)\)打,第二轮要和\((3,4) ...

  8. ARC093 F Dark Horse——容斥

    题目:https://atcoder.jp/contests/arc093/tasks/arc093_d #include<cstdio> #include<cstring> ...

  9. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

随机推荐

  1. windows 编译安卓iconv 库

    由于NDK r15后,谷歌要统一将来的设备都要支持64位,而iconv只支持32位,后续的ndk都会去除iconv的支持,所以只能在iconv的官网下载源码编译库文件使用, 下载地址:https:// ...

  2. mysql架构和历史

    存储引擎 查看: show table status like 'bigcourse'; 结果: +-----------+--------+---------+------------+------ ...

  3. a链接打开另外的新页面

    在a标签添加target = "_blank" 属性即可

  4. javascript中string对象方法中的slice、substring、substr的区别联系

    1.slice.substring.snustr均属于String的对象方法,用于截取或提取字符串片段,三者均布破坏原先的字符串,而是以新的字符串返回被提取的部分. <script> va ...

  5. TP3.2.3 页面跳转后 Cookie 失效 —— 参考解决方案

    一.问题描述 接手一个项目,使用ThinkPhp3.2.3,在线上环境( Centos7.4 + Nginx1.14 + MySQL5.7 + PHP7.2.4 )运行没有问题, 在本地环境( php ...

  6. python-含参函数

    #!/usr/local/bin/python3 # -*- coding:utf-8 -*- ''' #----------函数位置参数和关键字参数---------- def test(x,y): ...

  7. C指针(1)——指针在数组中的应用(程序讲解)

    2-1.c数组指针的定义: #include <stdio.h> int main() { char str[]="China Beijing Fujian"; //定 ...

  8. 词向量1.md

    词向量 我们以句子分类为例,我们使用深度学习模型对句子进行分类,本质上这个模型的接受的舒服需要是数值型.因为文字是人们抽象出来的一个概念,这个 东西是不能被计算机直接理解的,我们需要人为的将这个文字转 ...

  9. 11-Json文件配置

    1-新建json文件, 设置json文件生成的方式 { "ClassNo": "1", "ClassDesc": "Asp.net ...

  10. 17,saltstack高效运维

      salt介绍 saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统. salt强大吗 系统管理员日常会进行大量的重复性操作,例如安 ...