ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[ARC093D] Dark Horse

2022-04-08 16:34:25  阅读:189  来源: 互联网

标签:Horse 系数 leftarrow int ARC093D 容斥 Dark dp 条链


一、题目

点此看题

二、解法

以前我是做过类似的题的,但是现在为什么这都做不来了呢?

我们先把 \(1\) 固定在 \(1\) 号位计算,最后再把答案乘上 \(2^n\) 即可。对 \(1\) 打到根的这条链进行计数,考虑容斥原理,如果 \(a_1,a_2...a_m\) 中的某个人出现在了这条链上,就增加 \(-1\) 的容斥系数,剩下的人可以任意排列。

考虑 \(dp\) 计算容斥系数,我们按照编号从大到小的顺序来 \(dp\),设 \(dp[i][s]\) 为考虑 \(m\) 个人的前 \(i\) 个(排序后),占据链上位置集合是 \(s\) 的容斥系数。那么转移考虑第 \(i\) 个人不在链上,或者占据链上的某个位置:

\[dp[i][s]\leftarrow dp[i-1][s]\\dp[i][s|2^j]\leftarrow dp[i-1][s]\cdot {2^n-s-a_i\choose 2^{j}-1}\cdot 2^j! \]

时间复杂度 \(O(nm2^n)\)

#include <cstdio>
#include <algorithm>
using namespace std;
const int M = (1<<16)+5;
const int MOD = 1e9+7;
#define int long long
int read()
{
	int x=0,f=1;char c;
	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
	return x*f;
}
int n,m,ans,a[20],fac[M],inv[M],dp[20][M];
void add(int &x,int y) {x=(x+y)%MOD;}
void init(int n)
{
	fac[0]=inv[0]=inv[1]=1;
	for(int i=2;i<=n;i++) inv[i]=inv[MOD%i]*(MOD-MOD/i)%MOD;
	for(int i=2;i<=n;i++) inv[i]=inv[i-1]*inv[i]%MOD;
	for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%MOD;
}
int C(int n,int m)
{
	if(n<0 || n<m) return 0;
	return fac[n]*inv[m]%MOD*inv[n-m]%MOD;
}
signed main()
{
	n=read();m=read();init(1<<n);
	for(int i=1;i<=m;i++) a[i]=read();
	sort(a+1,a+1+m,[&](int i,int j){return i>j;});
	dp[0][0]=1;
	for(int i=1;i<=m;i++) for(int s=0;s<(1<<n);s++)
	{
		add(dp[i][s],dp[i-1][s]);
		for(int j=0;j<n;j++) if(!(s>>j&1))
		{
			add(dp[i][s|(1<<j)],dp[i-1][s]
			*C((1<<n)-s-a[i],(1<<j)-1)%MOD*fac[1<<j]);
		}
	}
	for(int s=0;s<(1<<n);s++)
	{
		int f=dp[m][s]*fac[(1<<n)-1-s]%MOD;
		if(__builtin_popcount(s)%2) add(ans,MOD-f);
		else add(ans,f); 
	}
	printf("%lld\n",ans*(1<<n)%MOD);
}

标签:Horse,系数,leftarrow,int,ARC093D,容斥,Dark,dp,条链
来源: https://www.cnblogs.com/C202044zxy/p/16117938.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有