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;
}
posted @ 2023-12-18 15:44  5k_sync_closer  阅读(3)  评论(0编辑  收藏  举报  来源