LGP5363题解

感觉博弈题都是高大上神秘结论。。。

感谢@KaiSuoShuTong 开锁疏通愿意教我这题的博弈部分/qq

考虑每次移动棋子,实际上是有一车 \(a_i\),每次操作相当于令 \(a_i-c,a_{i+1}+c\)

考虑奇数位置上的 \(a_i\)\(0\) 时的策略。我们发现如果此时先手走一步,后手也会跟着走一步同样的。所以此时偶数位置上的数为多少都无所谓。

考虑奇数位置上有值的情况。只要我成功将奇数位置上的数全部清空,那么我就胜利了。

然后变成了普通的 nim 游戏。

结论:是否获胜相当于对奇数上的位置做 nim 游戏。

nim 游戏的必输状态为异或起来全 \(0\)。(二进制下每一位之和为偶数)

正难则反,必输比必胜好考虑。我们考虑计算必输状态。

和 LGP2490 一样,考虑对奇数堆和偶数堆分别构造 GF。

下面设 \(b=\lfloor\frac{m}{2}\rfloor,a+b=m\)

设奇数块的 GF \(F(x,y)\) 为:

\[F(x,y)=\prod_{i=0}\sum_{j=0}^1x^{j2^i}y_i^j \]

偶数块和最后一段的 GF \(G(x)\) 为:

\[G(x)=\sum_{i=0}x^i=\frac{1}{1-x} \]

有:

\[H(x,y)=x^{a+b}F^a(x,y)G^{b+1}(x) \]

答案为:

\[ans=[x^n]\sum_{2|t_i}[\prod y_i^{t_i}]H(x,y) \]

然后我们随便推一下:

\[F^a(x,y)=\prod_{i=0}\sum_{j=0}^ax^{j2^i}y_i^j \]

\[H(x,y)=\frac{\prod_{i=0}\sum_{j=0}^a\binom{a}{j}x^{j2^i}y_i^j}{(1-x)^{b+1}} \]

\[ans=[x^{n-m}]\sum_{2|t_i}[\prod y_i^{t_i}]H(x,y) \]

考虑 \(F_k(x,y)=\prod_{i=0}^k\sum_{j=0}^a\binom{a}{j}x^{j2^i}y_i^j\),以及 \(dp[t][n]=[x^n]\sum_{2|t_i}[\prod y_i^{t_i}]F_{k-1}(x,y)\)

转移是个卷积。

复杂度 \(O(nm\log n)\)

#include<cstdio>
typedef unsigned ui;
const ui M=1.5e5+5,mod=1e9+9;
ui n,m,a,b,C[30],g[M],dp[19][M];
inline ui pow(ui a,ui b){
	ui ans(1);for(;b;b>>=1,a=1ull*a*a%mod)if(b&1)ans=1ull*ans*a%mod;return ans;
}
inline ui binom(const ui&n,const ui&m){
	ui x(1),y(1),z(1);
	for(ui i=1;i<=n;++i)x=1ull*x*i%mod;
	for(ui i=1;i<=m;++i)y=1ull*y*i%mod;
	for(ui i=1;i<=n-m;++i)z=1ull*z*i%mod;
	return 1ull*x*pow(1ull*y*z%mod,mod-2)%mod;
}
signed main(){
	ui lgn(0),ans(0);
	g[0]=g[1]=1;C[0]=C[1]=1;dp[0][0]=1;
	scanf("%u%u",&n,&m);b=m>>1;a=m-b;n-=m;
	while((1<<lgn)<=n)++lgn;--lgn;
	for(ui i=2;i<=a;++i)C[i]=1ull*(mod-mod/i)*C[mod%i]%mod;
	for(ui i=1;i<=a;++i)C[i]=1ull*C[i]*C[i-1]%mod*(a-i+1)%mod;
	for(ui i=2;i<=n;++i)g[i]=1ull*(mod-mod/i)*g[mod%i]%mod;
	for(ui i=1;i<=n;++i)g[i]=1ull*g[i-1]*g[i]%mod*(b+i)%mod;
	for(ui i=1;i<=lgn;++i){
		for(ui j=0;j<=n;++j){
			for(ui x=0;(x<<i-1)<=j&&x<=a;x+=2)dp[i][j]=(dp[i][j]+1ull*C[x]*dp[i-1][j-(x<<i-1)])%mod;
		}
	}
	for(ui i=0;i<=n;++i)ans=(ans+1ull*dp[lgn][i]*g[n-i])%mod;
	printf("%u",(mod+binom(n+m,m)-ans)%mod);
}
posted @ 2022-03-04 10:26  Prean  阅读(14)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};