我们可以假设1的位置在1,并且依次与右边的区间合并。答案最后乘上2^n即可。

那么需要考虑1所在的区间与另一个区间合并时,另一个区间的最小值不能为特殊的。

直接求解很难,考虑容斥,钦定在哪几个位置必定输,容斥出必胜的方案数。

从大到小dp,设f(i,S)表示当前考虑到第i个特殊的数,必输的区间集合为S。

考虑是否向集合S中加入i,若加入,枚举在哪个区间合并,用组合数算出能够选出的数的方案并乘上排列数。

若不加入,则直接转移即可。

f(i,S) <- f(i+1,S)

f(i,S|(1<<k)) <- Σ f(i+1,S) * C((1<<n)-S-a[i],(1<<k)-1) * (1<<k)!

最后f(i,S)对答案的贡献还要乘上没有钦定的位置数的排列。

最后答案乘上2^n。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=17,mod=1e9+7;
int n,m,a[N],f[N][1<<N],fac[1<<N],ifac[1<<N];
int Pow(int x,int k){
int ret=1;
while(k){
if(k&1)ret=(ll)ret*x%mod;
k>>=1;x=(ll)x*x%mod;
}
return ret;
}
int C(int n,int m){
if(n<m)return 0;
return (ll)fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)scanf("%d",&a[i]);
fac[0]=1;
for(int i=1;i<=(1<<n);i++)fac[i]=(ll)fac[i-1]*i%mod;
for(int i=0;i<=(1<<n);i++)ifac[i]=Pow(fac[i],mod-2);
sort(a+1,a+m+1,greater<int>());
f[0][0]=1;
for(int i=0;i<m;i++)
for(int j=0;j<(1<<n);j++){
if(!f[i][j])continue;
f[i+1][j]=(f[i+1][j]+f[i][j])%mod;
int res=(1<<n)-j-a[i+1];
for(int k=0;k<n;k++){
if(j&(1<<k))continue;
if(res<(1<<k)-1)break;
f[i+1][j|(1<<k)]=(f[i+1][j|(1<<k)]-(ll)f[i][j]*C(res,(1<<k)-1)%mod*fac[1<<k])%mod;
}
}
int ans=0;
for(int i=0;i<(1<<n);i++){
ans=(ans+(ll)f[m][i]*fac[(1<<n)-1-i])%mod;
}
ans=((ll)ans*(1<<n)%mod+mod)%mod;
cout<<ans<<"\n";
}

arc093F Dark Horse的更多相关文章

  1. [AtCoder ARC093F]Dark Horse

    题目大意:有$2^n$个人,每相邻的两个人比赛一次.令两个人的编号为$a,b(a\leqslant b)$,若$a\neq 1$,则$a$的人获胜:否则若$b\in S$则$b$获胜,不然$1$获胜. ...

  2. 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\)都不属于\( ...

  3. ARC093F Dark Horse 容斥原理+DP

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

  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. ARC093 F - Dark Horse

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

  7. ARC093 F Dark Horse——容斥

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

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

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

  9. 五道java小题,补更四道java小题

    一:分析以下需求,并用代码实现     1.定义List集合,存入多个字符串     2.删除集合中字符串"def"     3.然后利用迭代器遍历集合元素并输出 import j ...

随机推荐

  1. 版本管控---Visual Source Safe(VSS)和Team Foundation Server(TFS)

    Visual Source Safe 是用于软件专业开发人员的源代码管理工具 Team Foundation Server是为开发团队提供集成源代码管理.问题跟踪和进程管理的更改管理系统 相同点 1. ...

  2. C# 之VS程序打包

    VS2012没有自带打包工具,所以要先下载并安装一个打包工具.我采用微软提供的打包工具:  InstallShield2015LimitedEdition.下载地址:http://pan.baidu. ...

  3. poj 2992 Divisors (素数打表+阶乘因子求解)

    Divisors Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9617   Accepted: 2821 Descript ...

  4. WCF IIS 部署错误处理

    做Web接口,原来一直用Web Service的,但是.Net 3.5后,Web Service变成了WCF.代码的编写上,把WebMethod特性改成了OperationContract,然后把方法 ...

  5. PHP处理时间格式

    1. 把‘2016-06-16’格式转换成‘20160616’ <?php header("Content-type: text/html; charset=utf-8"); ...

  6. BZOJ2229: [Zjoi2011]最小割(最小割树)

    传送门 最小割树 算法 初始时把所有点放在一个集合 从中任选两个点出来跑原图中的最小割 然后按照 \(s\) 集合与 \(t\) 集合的归属把当前集合划分成两个集合,递归处理 这样一共跑了 \(n − ...

  7. SQL server查找指定表的所有索引

    WITH tmp AS ( SELECT indexname = a.name , tablename = c.name , indexcolumns = d.name , a.indid FROM ...

  8. Angular面试题一

    一.ng-show/ng-hide 与 ng-if的区别? 第一点区别是, ng-if 在后面表达式为 true 的时候才创建这个 dom 节点, ng-show 是初始时就创建了,用 display ...

  9. eclipse 断点调试快捷键

    (1)Ctrl+M --切换窗口的大小(2)Ctrl+Q --跳到最后一次的编辑处(3)F2 --当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Too ...

  10. 一步一步pwn路由器之栈溢出实战

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 本文以 DVRF 中的第一个漏洞程序 stack_bof_01 为 ...