• CF 1025 E : Expected Value Again


    Link

    简要题意:给字符集大小和串长,求border个数的平方的期望

    (nle 1e5)

    基本的转化就不说了,现在需要对一对(i,j)求他们都是(border)的方案数。

    (i)是一个(border) (Leftrightarrow) (n-i)是一个循环节(可以超出)

    同时我们可以知道(f_i(s)=1)的概率是(k^{-i})

    现在考虑(n-i=i_1, n-j=j_2)

    枚举(i,j)的答案是(k^{max (i_1+j_1-n,gcd (i_1,j_1))-n}​)

    proof:

    首先考虑(i_1+j_1 le n​)的情况,这种情况下显然可以通过(+j​)之后每次相减做到(gcd (i_1,j_1)​)

    现在考虑(i_1+j_1>n)的时候。不妨设(i_1>j_1),同时我们有(i<j)(j < i_1)

    现在相当于要统计联通块的个数(t)

    将所有点按照(mod gcd(i_1,j_1)​)分组

    我们还不难发现,每个点的度数最大是(2)。考虑一下度数正好都是(2)的时候会发生什么。

    首先是(+i_1)的边将原图分成了一堆链。之后每个点相当于是在(i_1/gcd(i_1,j_1))的环上走(j_1/gcd(i_1,j_1))

    因为步长和环长互质,所以这一定是一个大环。

    不难发现如果两条边都向左的点度数都是2,那这个图就是一个大环了。

    于是我们统计有多少个(x mod gcd(i_1,j_1)),满足这个分组的店中有至少一个点度数不满即可。

    考虑(>n-i_1)的点,这些点没有向右连的边,向连的边我们只用关注(j_1)的边,如果有则(i_1)的边也一定存在。

    考虑(le j_1)的点才没有向左连的边,我们考虑这样的区间((i,j_1])

    讨论一下:

    • 如果有(j_1-ige gcd(i_1,j_1))则每个(x)都被漏掉了,直接计算边数就能算出连通块个数是(i_1+j_1-n)

    • 如果(j_1-ile gcd(i_1,j_1))则恰好有(gcd(i,j)-(j_1-i))条边是成环了,算出来(t=gcd (i_1,j_1))

    综上,答案是(k^{max (i_1+j_1-n,gcd (i_1,j_1))-n})

    这个可以在(nlog ^2n)的时间做出来

  • 相关阅读:
    Go组件学习——Web框架Gin
    一次线上接口超时的排查过程
    Go组件学习——手写连接池并没有那么简单
    终于跑通分布式事务框架tcc-transaction的示例项目
    Go语言学习——如何实现一个过滤器
    Go组件学习——database/sql数据库连接池你用对了吗
    我们这一年 | 诗人呀
    NodeMan架构
    NodeMan介绍
    微信小程序录音实现
  • 原文地址:https://www.cnblogs.com/weiyanpeng/p/11394497.html
Copyright © 2020-2023  润新知