AT_arc132_e [ARC132E] Paw 题解
称一个极长无 $\texttt .$ 区间为一段,则最终形态中一定有一段不变,其左侧全为 $\texttt <$,右侧全为 $\texttt >$。
也就是说,最终形态只有 $O(n)$ 种,而每种的 $\texttt <$ 个数容易统计,只需考虑每种形态的出现概率。
设 $f_n$ 表示把含 $n$ 个 $\texttt .$ 的前缀全变为 $\texttt <$ 的概率,则 $f_n=(1-\dfrac 1{2n})f_{n-1}$,
而把含 $n$ 个 $\texttt .$ 的后缀全变为 $\texttt >$ 的概率是对称的。
于是,设 $[l,r]$ 这一段左边有 $x$ 个 $\texttt .$,右边有 $y$ 个 $\texttt .$,
则 $[l,r]$ 不变,左侧全变为 $\texttt <$,右侧全变为 $\texttt >$ 这种形态的出现概率为 $f_x\times f_y$。
#include <cstdio>
#define M 998244353
#define int long long
int n, q, l, v[200050], f[200050], s[200050], t[200050];
char a[200050];
signed main()
{
v[1] = 1;
for (int i = 2; i <= 2e5; ++i)
v[i] = (M - M / i) * v[M % i] % M;
f[0] = 1;
for (int i = 1; i <= 1e5; ++i)
f[i] = f[i - 1] * (1 + M - v[i << 1]) % M;
scanf("%lld%s", &n, a + 1);
for (int i = 1; i <= n; ++i)
s[i] = t[i] = a[i] == '.';
for (int i = 1; i <= n; ++i)
s[i] += s[i - 1];
for (int i = n; i >= 1; --i)
t[i] += t[i + 1];
for (int i = 1; i <= n; ++i)
if (a[i] == '.')
{
int z = 0;
for (int j = l + 1; j < i; ++j)
z += a[j] == '<';
z += l;
q = (q + z * f[s[l]] % M * f[t[i]]) % M;
l = i;
}
int z = 0;
for (int j = l + 1; j <= n; ++j)
z += a[j] == '<';
z += l;
q = (q + z * f[s[l]] % M * f[0]) % M;
printf("%lld", q);
return 0;
}