题意: 我们现在有一个有2的n次方的人的淘汰赛,每次相邻的两个人打,赢得人晋级,以此类推到只剩一个人为止。给定一个集合a[i], 规则如下:1号和a[i]的人打a[i]胜,1号和其他人打 1号胜利,其他号和其他的打,字典序小的胜。问1号胜利的方案数有多少种。

我们先假装第一个人就在第一个位置,由于都是从一个2^1的人中取胜,到从2^n的人中取胜,所以一号人在哪方案数都是一样的,所以我们可以假装第一个人就在第一个位置,最后算答案的时候×2^n即可。

接着我们观察1的对手是谁, 我们假设n=3, 那么 n的对手就是 2 , [3,4] , [5,8] 的胜者,即为1向后推 2^0次方的长度到2^n-1次方的长度每一个区间的胜者,所以这些区间的胜者不能为a[i]。由于都和1无关,所以要求就是这些区间中字典序最小的不能是a[i]。正着做不好做,我们考虑某个区间胜者是a[i]的方案数,最后容斥一下就好了。

令dp[i][state]表示考虑到第i个a[i]了,有那些区间的胜者已经是a[i]了。很显然每个a[i]可以有两种选择,第一种不选,第二种找一个没有选的区间加入到其中,设区间长度为len,就还要找 len-1个比它大的填入到这个区间里。 由于dp的状态的0,1就表示每个区间选了没选,所以state的数值就表示了有多少个人选了。这里注意到要找的是比a[i]大的并不是很好找,所以我们按a[i]从大到小排序,那么这时比a[i]大的数字就是n-state-a[i]个了。

等等这时候不就求出来了吗,要容斥啥??? 因为对于没有选的区间,我们是随便放剩下的,所以可能会把是a[i]的放到某个区间做最小值了。

所以 如果state里有j个1,那么我们求出来的就是 有大于等于j的区间被a[i]放了的方案数,我们就根据j的奇偶性加加减减就好啦,最后记得乘2的n此方。

下附AC代码。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxn (1<<17)+5
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
int n,m;
int a[20];
ll fac[maxn],inv[maxn];
ll dp[20][maxn];
ll quickpow(ll p,ll k)
{ll ans=1;while(k){if(k&1)ans=(ans*p)%mod;p=(p*p)%mod;k>>=1;}return ans;
}
ll c(ll n1,ll m1)
{if(n1<m1) return 0;return fac[n1]*inv[m1]%mod*inv[n1-m1]%mod;
}
int getbit(int now)
{int res=0;while(now)res+=(now&1),now>>=1;return res;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d",&a[m-i+1]);fac[0]=1;for(int i=1;i<=maxn-5;i++)fac[i]=fac[i-1]*i%mod;inv[maxn-5]=quickpow(fac[maxn-5],mod-2);for(int i=maxn-5;i>=1;i--)inv[i-1]=inv[i]*i%mod;inv[0]=1;dp[0][0]=1;for(int i=0;i<m;i++){for(int state=0;state<(1<<n);state++)if(dp[i][state]){dp[i+1][state]+=dp[i][state];dp[i+1][state]%=mod;for(int j=0;j<n;j++)if(((1<<j)&state)==0){dp[i+1][state|(1<<j)]+=(dp[i][state]*fac[(1<<j)]%mod*c((1<<n)-state-a[i+1],(1<<j)-1)%mod);dp[i+1][state|(1<<j)]%=mod;}}}ll ans=0;for(int state=0;state<(1<<n);state++){int cnt=getbit(state);ll f=(cnt&1)?-1:1;ans=(ans+f*dp[m][state]*fac[(1<<n)-state-1])%mod;}ans=(ans%mod+mod)%mod;printf("%lld\n",(ans*(1<<n))%mod);
}

Especially For U

By ZRX

arc 093 F Dark Horse相关推荐

  1. [最小割] ARC 074 F - Lotus Leaves

    Solution Solution 这样建图:对每一行每一列都建一个点,连向行内的荷叶. 那这道题就相当于删去最少的点使得源汇点不连通. 按这里一样建图就好了. 又忘记写当前弧优化了 #include ...

  2. Atcoder 乱做

    最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...

  3. 足球相关的英文专业术语(持续更新中...Ctrl+F可直接进行搜索)

    技术 long pass 长传 close pass, short pass 短传 flank pass 边线传球 high lobbing pass 高吊传球 scissor pass 交叉传球 v ...

  4. php判断数组不重复的元素,php从数组中随机选择若干不重复元素

    php从数组中随机选择若干唯一元素 /* * $array = the array to be filtered * $total = the maximum number of items to r ...

  5. 「版权流氓」终结者:6天时间,堆出687亿段旋律

    萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 世界上所有的音乐,都在这个网站里了. 准确地说,是一个八度内,所有音符的组合方法. 两个程序员Riehl和Rubin,用6天时间,以每秒30 ...

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

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

  7. 【NLP】从整体视角了解情感分析、文本分类!

    作者:太子长琴,算法工程师,Datawhale成员 文本分类是自然语言处理(NLP)最基础核心的任务,或者换句话说,几乎所有NLP任务都是「分类」任务,或者涉及到「分类」概念.比如分词.词性标注.命名 ...

  8. [CF/AT/Luogu]各大网站网赛 爆肝部部长工作报告文件Ⅱ

    文章目录 CodeForces LATOKEN-Round-1(Div.1+Div.2) A. Colour the Flag B. Histogram Ugliness C. Little Alaw ...

  9. [CF/AT]各大网站网赛 体验部部长第一季度工作报告

    文章目录 CodeForces #712 (Div. 1)--1503 A. Balance the Bits B. 3-Coloring C. Travelling Salesman Problem ...

  10. RazorExtensions Templated Razor Delegates

    原文发布时间为:2011-04-27 -- 来源于本人的百度文章 [由搬家工具导入] Templated Razor Delegates David Fowler turned me on to a ...

最新文章

  1. Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
  2. Hadoop生态系统的详细介绍
  3. λ演算的语法和语义_λ和副作用
  4. 软硬兼备 学做CIO
  5. c语言程序设计平时作业代刷,C语言程序设计——小学生口算刷题系统
  6. 信息学奥赛一本通 1956:【11NOIP普及组】表达式的值 | 洛谷 P1310 [NOIP2011 普及组] 表达式的值
  7. BindFlags的作用
  8. react-native-router-flux 页面跳转与传值
  9. 搜索引擎的基本工作原理
  10. java游戏繁体字名字_游戏繁体字名字
  11. 正则表达式与自动机c语言,用有限自动机实现正则表达式的匹配
  12. 018 EPLAN 宏部件库 西门子 欧姆龙 三菱PLC窗口宏ema正泰edz数据 mdb(94G)
  13. signature=0805b6a4f11b6551d9a746082990b689,Derived certificate based on changing identity
  14. intent传递集合数据
  15. LeetCode 0883「三维形体投影面积」
  16. js如何实现随机数切换
  17. tools1.0.1
  18. open source 3d map_3D视觉技术在机器人抓取作业中的应用实例
  19. 杂七杂八 | Disco Diffusion
  20. 网闸的设计原理与误区

热门文章

  1. mac 管理 android手机助手,Mac 篇十二:Mac如何更高效的管理安卓手机和iPhone,老机器也可用哦...
  2. 【DPD数字预失真】射频功放的Volterra级数数字预失真系统开发
  3. 互联网快讯:“20220222”扎堆领证;极米多款产品获消费者肯定;星巴克两门店使用过期食材被罚
  4. RTX3060(30系显卡)Windows10部署Pytorch深度学习环境步骤与心得
  5. iOS最新面试题(一)
  6. 腾讯自选股如何实现单位小时内完成千万级数据运算
  7. 正式入职开发工程师工作近半年有感
  8. 【2020新书推荐】程序员值得一读的机器学习新书
  9. 常用工具:用yEd工具画流程图实用步骤
  10. 联想电脑尺寸在哪里看_如何检查联想电脑型号【详细介绍】