给定长为 (n) 的黑白序列 (c_i) 和正整数 (s)。小黑和小白在下黑白棋,初始时第 (s) 个位置有 (c_s) 色的棋子,两人轮流操作,小黑先手:选择与已有棋子相邻的位置 (i),在上面下 (c_i) 色棋子,并找到距离其最近的同色棋子的位置 (j),当 (j) 存在时令 (i) 与 (j) 之间的棋子都变为 (c_i) 色。
不能操作时游戏就结束了。小黑想让黑色棋子尽量多,小白想让白色棋子尽量多。
给定正整数 (n),(forall sin[1,n]),求当 (c) 均匀随机生成时最终黑色棋子数的期望值(mod 998244353)。
(nle 2cdot 10^5)。
1D 黑白棋显然很sb,手玩一下就知道任意时刻状态都是一段黑+一段白或者反过来。
若 (c_1=c_n) 则最终状态一定全是 (c_1),否则设开头相同连续段是 ([1,L]),结尾是 ([R,n]),则小黑会向黑连续段冲锋(?),只要先到了 ((L,R)) 就是小黑的,否则就是小白的。
可以考虑求两项差值,当 (s-L e 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
", (i <= 2 || i >= n-1) ? tmp : qmo(tmp + f[i-max(2*i-n,1)] - mod));
}