Description

题解

比赛过程可以看成一棵满的二叉树
不妨把第一个人先固定在1的位置上,答案乘一个2n2^n2n就行了
因为显然相同子树内对调一下两个儿子没有影响
于是就是1先和2比,再和min(3~4),min(5~8),min(9~16)…这些比
那显然这m个数不能是任意一个区间的最小值
直接做不好做,容斥一下
这个容斥还是很常规的…
先把这m个数从大到小排
设一个dp[i][mask]dp[i][mask]dp[i][mask]表示前i个数确定了maskmaskmask这个状态的区间的最小值
转移直接转移就行了…

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
#include<map>
#include<bitset>
#define LL long long
#define mp(x,y) make_pair(x,y)
#define pll pair<long long,long long>
#define pii pair<int,int>
using namespace std;
inline LL read()
{LL f=1,x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int stack[20];
inline void write(int x)
{if(x<0){putchar('-');x=-x;}if(!x){putchar('0');return;}int top=0;while(x)stack[++top]=x%10,x/=10;while(top)putchar(stack[top--]+'0');
}
inline void pr1(int x){write(x);putchar(' ');}
inline void pr2(int x){write(x);putchar('\n');}
const int MAXN=1000005;
const int MAXM=21;
const int MAXMASK=(1<<16);
const LL mod=1e9+7;
int bin[MAXM];
LL pre[MAXN],inv[MAXN];
LL pow_mod(LL a,LL b)
{LL ret=1;while(b){if(b&1)ret=ret*a%mod;a=a*a%mod;b>>=1;}return ret;
}
LL C(int n,int m){return pre[n]*inv[m]%mod*inv[n-m]%mod;}
int n,m,a[MAXM];
int f[MAXM][MAXMASK],ct[MAXMASK];
void ad(int &x,int y){x+=y;if(x>=mod)x-=mod;}
void dl(int &x,int y){x-=y;if(x<0)x+=mod;}
int main()
{pre[0]=1;for(int i=1;i<MAXN;i++)pre[i]=pre[i-1]*i%mod;inv[MAXN-1]=pow_mod(pre[MAXN-1],mod-2);for(int i=MAXN-2;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;bin[1]=1;for(int i=2;i<=20;i++)bin[i]=bin[i-1]<<1;for(int i=0;i<MAXMASK;i++)for(int j=1;j<=16;j++)if(i&bin[j])ct[i]+=bin[j];n=read();m=read();for(int i=1;i<=m;i++)a[i]=read();sort(a+1,a+1+m);reverse(a+1,a+1+m);f[0][0]=1;for(int i=1;i<=m;i++)for(int k=0;k<bin[n+1];k++){ad(f[i][k],f[i-1][k]);for(int j=1;j<=n;j++)if(!(k&bin[j])){if(bin[n+1]-a[i]+1-k>=bin[j])ad(f[i][k|bin[j]],(LL)f[i-1][k]*C(bin[n+1]-a[i]-k,bin[j]-1)%mod*pre[bin[j]]%mod);}}int ans=0;for(int i=0;i<bin[n+1];i++){int u1=(LL)f[m][i]*pre[bin[n+1]-i-1]%mod,u2=0;for(int j=1;j<=n;j++)if(i&bin[j])u2++;if(u2&1)dl(ans,u1);else ad(ans,u1);}ans=(LL)ans*bin[n+1]%mod;pr2(ans);return 0;
}

[ARC093-F][容斥原理][DP]Dark Horse相关推荐

  1. ARC101E Ribbons on Tree 容斥原理+dp

    题目链接 https://atcoder.jp/contests/arc101/tasks/arc101_c 题解 直接容斥.题目要求每一条边都被覆盖,那么我们就容斥至少有几条边没有被覆盖. 那么没有 ...

  2. [bzoj4455][容斥原理][DP]小星星

    Description 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细 线连着两颗小星星.有一天她发现,她的饰品被破坏了,很多细线都被拆掉了.这 ...

  3. 2019.02.09 bzoj4455: [Zjoi2016]小星星(容斥原理+dp)

    传送门 题意简述:给一张图和一棵树(点数都为n≤17n \le17n≤17),问有多少种给树的标号方法方法使得图中去掉多余的边之后和树一模一样. 思路: 容斥好题啊. 考虑fi,jf_{i,j}fi, ...

  4. F - Tian Ji -- The Horse Racing

    题目如下: Here is a famous story in Chinese history. "That was about 2300 years ago. General Tian J ...

  5. BZOJ 3622 Luogu P4859 已经没有什么好害怕的了 (容斥原理、DP)

    题目链接 (Luogu) https://www.luogu.org/problem/P4859 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...

  6. codeforces1208 F. Bits And Pieces(SOS DP)

    heyuhhh高维前缀和总结 SOS DP SOS Dynamic Programming [Tutorial] 之前写过相关的题目枚举子集dp 枚举子集 F[mask]=∑i∈maskA[i],i& ...

  7. 【BZOJ4455】【UOJ185】【ZJOI2016】小星星(树形DP,容斥原理)

    Description http://uoj.ac/problem/185 Solution 单考虑下面Code中的那个dp函数,设fi,jfi,jf_{i,j}表示iii映射到j" rol ...

  8. 【原创】概率DP总结 by kuangbin

    概率DP主要用于求解期望.概率等题目. 转移方程有时候比较灵活. 一般求概率是正推,求期望是逆推.通过题目可以体会到这点. 首先先推荐几篇参考的论文: <信息学竞赛中概率问题求解初探> & ...

  9. AtCoder - ABC 178 - C~F

    C - Ubiquity(容斥原理/DP) 题意: 求满足以下条件的长为 n 的不同序列的个数: 1.0 ≤  ≤9 2.序列中至少有一个 =0 3.序列中至少有一个 =9 答案对 +7 取模. 数据 ...

  10. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

最新文章

  1. Oracle中的字符处理方法
  2. perl编程(基本语法 数据 类型)
  3. TortoiseSVN SendRpt.exe not found解决方案
  4. python3 requests 错误EOF occurred in violation of protocol 解决方法
  5. 如何快速上手mysql_如何快速上手数据库操作?
  6. docker安装rabbitmq延时队列插件
  7. POJ 3988 Selecting courses
  8. Open3d之计算源点云与目标云的距离
  9. java数组实现队列
  10. oracle中表空间实例,oracle的表空间实例详解
  11. javascript createelement_如何创建与框架无关的JavaScript插件
  12. Excel 文件格式解析
  13. unity商店demo学习:跑酷游戏
  14. 【Unity实战100例】技能伤害区域判定(矩形,圆,三角形,扇形)(三)
  15. Mac上Java环境变量配置_飘云羽逸_新浪博客
  16. 计算机术语中ict表示是什么意思,ICT是什么工作
  17. 2009年牛年九星分布图
  18. //编写一个学生类(Students),包括姓名(name)、性别(sex)、学号(num)、语文课(Chinese)、英语课(English)、 //数学课(Math)和平均值(avg)
  19. java byte与char互转原理_【转】java byte与char互转原理
  20. 基于element UI的省(市)(区)三级(二级)(一级)联动数据以及使用方法

热门文章

  1. 为什么qq不出linux版本,腾讯QQ官方Linux版本要发布了
  2. 【centos8】问题解决:Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist:.
  3. 初识 Arm 处理器
  4. 会员系统+企业微信+小程序,助力私域高效转化
  5. 计算机关机界面卡住,win7关机卡死在正在关机界面
  6. 力扣刷题 DAY_89 贪心
  7. ensp中ap获取不到ip_ensp wlan实验,sta无法获取IP地址?
  8. 性能测试模型之曲线拐点模型——压力曲线分析图
  9. 华为手机图标怎么变小_华为手机字太小看不清?那是你不会设置!四种方法让手机显示变大...
  10. PRT电波拉皮的原理, 做电波拉皮效果好吗能维持多久