Examples

LGV 引理学习笔记

NOI2021D1T2 是 LGV 板板题,震撼。

ABC216H Random Robots

考虑转化题意:有 \(k\) 个起点 \((x_1,0),(x_2,0),\cdots,(x_k,0)\)\(n\) 轮,每轮所有位置 \((x,y)\) 都会等概率走到 \((x+1,y+1)\)\((x,y+1)\),求路径不相交的概率。(显然等价于方案数)

这个东西明示我们使用 LGV 引理,考虑 dp 求解,设 \(f(S,t)\) 为考虑集合 \(S\),终点的 \(x\) 最大值为 \(t\) 的答案:

\[f(S,t)=\sum_{0\leqslant y_1<y_2<\cdots<y_{|S|}\leqslant t}\left|\begin{matrix}w(x_{S_1},y_1)&w(x_{S_1},y_2)&\cdots&w(x_{S_1},y_{|S|})\\w(x_{S_2},y_1)&w(x_{S_2},y_2)&\cdots&w(x_{S_2},y_{|S|})\\\vdots&\vdots&\ddots&\vdots\\w(x_{|S|},y_1)&w(x_{|S|},y_2)&\cdots&w(x_{|S|},y_{|S|})\end{matrix}\right| \]

其中 \(w(x,y)={n\choose y-x}\)

\(y_k<t\)

\[f(S,t)\leftarrow f(S,t-1) \]

\(y_k=t\)

\[f(S,t)\leftarrow\sum_{i=1}^{|S|}(-1)^{|S|+i}w(x_{S_i},t)f(S-\{S_i\},t-1) \]

然后直接状压 dp 即可,时间复杂度:\(O(2^kk(n+\max\{x_i\}))\)

#include<stdio.h>
const int maxk=1<<10,maxn=2005,mod=998244353,inv2=(mod+1)/2;
int n,k,ans,mulinv2;
int x[maxn],bitcnt[maxk],f[maxk][maxn],C[maxn][maxn],mul[2];
int main(){
	scanf("%d%d",&k,&n);
	for(int i=1;i<=k;i++)
		scanf("%d",&x[i]);
	mul[0]=1,mul[1]=mod-1;
	for(int i=0;i<=n;i++){
		C[i][0]=C[i][i]=1;
		for(int j=1;j<i;j++)
			C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
	}
	mulinv2=1;
	for(int i=1;i<=n;i++)
		mulinv2=1ll*mulinv2*inv2%mod;
	for(int i=1;i<(1<<k);i++)
		bitcnt[i]=bitcnt[i>>1]+(i&1);
	f[0][0]=1;
	for(int i=0;i<=x[k]+n;i++){
		for(int j=0;j<(1<<k);j++)
			f[i+1][j]=f[i][j];
		for(int j=0;j<(1<<k);j++)
			for(int p=1;p<=k;p++)
				if(((j>>(p-1))&1)==0&&x[p]<=i&&i-x[p]<=n)
					f[i+1][j|(1<<(p-1))]=(f[i+1][j|(1<<(p-1))]+1ll*f[i][j]*mul[bitcnt[j>>(p-1)]&1]%mod*C[n][i-x[p]]%mod*mulinv2)%mod;
	}
	printf("%d\n",f[x[k]+n+1][(1<<k)-1]);
	return 0;
}
posted @ 2021-09-11 07:13  xiaoziyao  阅读(126)  评论(0)    收藏  举报