[AtCoder ARC093F]Dark Horse
题目大意:有$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的更多相关文章
- ARC093F Dark Horse 容斥原理+DP
题目传送门 https://atcoder.jp/contests/arc093/tasks/arc093_d 题解 由于不论 \(1\) 在哪个位置,一轮轮下来,基本上过程都是相似的,所以不妨假设 ...
- arc093F Dark Horse
我们可以假设1的位置在1,并且依次与右边的区间合并.答案最后乘上2^n即可. 那么需要考虑1所在的区间与另一个区间合并时,另一个区间的最小值不能为特殊的. 直接求解很难,考虑容斥,钦定在哪几个位置必定 ...
- 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\)都不属于\( ...
- 【arc093f】Dark Horse(容斥原理,动态规划,状态压缩)
[arc093f]Dark Horse(容斥原理,动态规划,状态压缩) 题面 atcoder 有 \(2^n\) 名选手,编号为 \(1\) 至 \(2^n\) .现在这 \(2^n\) 名选手将进行 ...
- ARC 093 F Dark Horse 容斥 状压dp 组合计数
LINK:Dark Horse 首先考虑1所在位置. 假设1所在位置在1号点 对于此时剩下的其他点的方案来说. 把1移到另外一个点 对于刚才的所有方案来说 相对位置不变是另外的方案. 可以得到 1在任 ...
- Atcoder Regular Contest 093 D - Dark Horse(组合数学+状压 dp)
Atcoder 题面传送门 & 洛谷题面传送门 常规题,简单写写罢((( 首先 \(1\) 的位置是什么不重要,我们不妨钦定 \(1\) 号选手最初就处在 \(1\) 号位置,最后答案乘个 \ ...
- ARC093 F - Dark Horse
https://atcoder.jp/contests/arc093/tasks/arc093_d 题解 先钦定\(1\)号站在第一个位置上,那么他第一轮要和\((2)\)打,第二轮要和\((3,4) ...
- ARC093 F Dark Horse——容斥
题目:https://atcoder.jp/contests/arc093/tasks/arc093_d #include<cstdio> #include<cstring> ...
- AtCoder Regular Contest 093
AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...
随机推荐
- 开发常用宏 - iOS
以下是一些开发中会经常用到的宏,简单的进行了整理,为了今后可以更加方便的使用,从而提升开发的效率,不为此搭进去更多时间. 也希望有大家可以补充,从而使其更加强加! /** * 开发常用宏相关 */ # ...
- BZOJ3288: Mato矩阵(欧拉函数 高斯消元)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 386 Solved: 296[Submit][Status][Discuss] Descriptio ...
- MySQL时间戳、时间
MySQL中: now():获取当前时间:例:SELECT now(); // 结果:2018-07-03 13:40:14 unix_timestamp():将时间转换为时间戳:例: SELECT ...
- 如何快速查看mysql数据文件存放路径?
进入mysql终端 mysql>show variables like '%datadir%'; 出来的结果即是!
- mysql,oracle表数据相互导入
mysql导入oracle: 例如mysql中有ts_user_info表,现在要导入到oracle中的user_info表 1:导出mysql表数据到data.txt文件 mysql> sel ...
- tcl之正则表达式
- ASPX页面请求响应过程
- Flask错误收集 【转】
感谢大佬 ---> 原文链接 一.pydev debugger: process XXXXX is connecting 这个错误网上找了很多资料都无法解决,尝试过多种方法后,对我来说,下面这个 ...
- Android 中运行时权限获取联系人信息 Demo
代码比较简单... AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <m ...
- 【UE4】二十四、UE4内部版本引擎和官方版本引擎版本保持兼容的方法
内部使用的引擎和官方正式发布的引擎版本号不一致,这种情况会导致一些插件由于版本不一致无法使用,有其是在没有插件源码的情况下.解决方法为 修改Engine\Source\Runtime\Launch\R ...