ARC109E 1D Reversi Builder【期望,分析性质】

传送门

给定长为 \(n\) 的黑白序列 \(c_i\) 和正整数 \(s\)。小黑和小白在下黑白棋,初始时第 \(s\) 个位置有 \(c_s\) 色的棋子,两人轮流操作,小黑先手:选择与已有棋子相邻的位置 \(i\),在上面下 \(c_i\) 色棋子,并找到距离其最近的同色棋子的位置 \(j\),当 \(j\) 存在时令 \(i\)\(j\) 之间的棋子都变为 \(c_i\) 色。

不能操作时游戏就结束了。小黑想让黑色棋子尽量多,小白想让白色棋子尽量多。

给定正整数 \(n\)\(\forall s\in[1,n]\),求当 \(c\) 均匀随机生成时最终黑色棋子数的期望值\(\bmod 998244353\)

\(n\le 2\cdot 10^5\)


1D 黑白棋显然很sb,手玩一下就知道任意时刻状态都是一段黑+一段白或者反过来。

\(c_1=c_n\) 则最终状态一定全是 \(c_1\),否则设开头相同连续段是 \([1,L]\),结尾是 \([R,n]\),则小黑会向黑连续段冲锋(?),只要先到了 \((L,R)\) 就是小黑的,否则就是小白的。

可以考虑求两项差值,当 \(s-L\ne R-s\) 时两边对称,否则中间一段就是小黑的。

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

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 200003, mod = 998244353;
int n, f[N];
int ksm(int a, int b){
	int res = 1;
	for(;b;b >>= 1, a = (LL)a * a % mod)
		if(b & 1) res = (LL)res * a % mod;
	return res;
} int qmo(int x){return x + ((x>>31)&mod);}
int main(){
	scanf("%d", &n); int tmp = (n & 1) ? (n+mod>>1) : (n>>1);
	for(int i = 2, pw = ksm(2, mod-n);i <= n;++ i, pw = pw * 4ll % mod)
		f[i] = (f[i-1] + (2*i-1ll)*pw) % mod; // 2i-1 = the length of (L,R)
	for(int i = 1;i <= n;++ i)
		printf("%d\n", (i <= 2 || i >= n-1) ? tmp : qmo(tmp + f[i-max(2*i-n,1)] - mod));
}
posted @ 2021-04-01 20:42  mizu164  阅读(133)  评论(0编辑  收藏  举报