AT_arc132_e [ARC132E] Paw 题解

称一个极长无 . 区间为一段,则最终形态中一定有一段不变,其左侧全为 <,右侧全为 >

也就是说,最终形态只有 O(n) 种,而每种的 < 个数容易统计,只需考虑每种形态的出现概率。

fn 表示把含 n. 的前缀全变为 < 的概率,则 fn=(112n)fn1

而把含 n. 的后缀全变为 > 的概率是对称的。

于是,设 [l,r] 这一段左边有 x.,右边有 y.

[l,r] 不变,左侧全变为 <,右侧全变为 > 这种形态的出现概率为 fx×fy

#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 @   Jijidawang  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示