zoukankan      html  css  js  c++  java
  • 题解-CF1205E

    这题完全体现了我的 数学推导 能力有多差。


    中间还被 alpha 教育了,我不会算这个复杂度/kk

    [O(sum_{i=1}^{n} sum_{j|i}sum_{k|frac{i}{j}}1)=O(nlog^2n) ]


    还是考虑拆平方的期望,我们发现即为 (sum_{i,j}f(i)f(j)),其中 (f(t)) 代表有一个长度为 (t) 的 border。于是我们想要计算的是每两个 border 有几个串有这么长的 border。每个 border 对应一个 period,而每个 period 即对应唯一的一个长度为 (n) 的串。所以我们可以把 border 转换为 period。

    period 的性质即为每个点 (s[t]=s[t+i]),所以我们不妨把相同的点连边,最后连通块的数量即为一个不确定的值,设为 (c),那么贡献即为 (k^c)

    结论:(c=max(gcd(i,j),i+j-n))

    第一个部分即为弱周期引理,第二个部分感性理解一下(画个图)就能发现。

    根据一些等价我们得到下面的式子。(上面是字符串和图论的部分,下面就全是数学推导了)

    [ans imes k^n=sum_{i=1}^{n-1}sum_{j=1}^{n-1}k^{max{gcd(i,j), i+j-n}} ]

    然后有一个不太能扩展的 (O(nlog^2n)) 做法。

    考虑枚举 (gcd(i,j))(i+j),然后计算同时满足 (i,j) 组数。

    [sum_{s=2}^{2n-2}sum_{d|s}sum_{i=1}^{n-1}sum_{j=1}^{n-1}[gcd(i,j)=d][i+j=s]\ =sum_{s=2}^{2n-2}sum_{d|s}sum_{i=1}^{n-1}[gcd(i,s-i)=d]\ =sum_{s=2}^{2n-2}sum_{d|s}sum_{i=1}^{[frac{n-1}{d}]}[gcd(i,frac{s}{d}-i)=1]\ =sum_{s=2}^{2n-2}sum_{d|s}sum_{i|frac{s}{d}}mu(i)sum_{j=ik}1 ]

    然后上面的式子有一个缺陷,就是 (i,j) 的范围没有表示。

    [1le ile n-1\ 1le s-ile n-1\ Rightarrow s+1-nle ile s-1\ ]

    然后令 (a=max{1,frac{s}{d}-[frac{n-1}{d}]},b=min{frac{[n-1]}{d},frac{s}{d}-1}),有最终的式子

    [sum_{s=2}^{2n-2}sum_{d|s}sum_{i|frac{s}{d}}mu(i)([frac{b}{i}]-[frac{a-1}{i}]) ]

    还有一个常见的 (O(nlog{n})) 算法和一个 (O(n)) 算法。看懂了但是不想写了(咕咕有空就补),可以在下面的题解里看到。

    reference

    木xx木大的 luogu 题解

  • 相关阅读:
    5.小程序-生命周期函数
    4.小程序-路由跳转
    3.小程序-事件绑定
    2.小程序-数据绑定
    1.小程序index页静态搭建
    小程序简介
    单链表(Go)
    输入一个字符串,里面有26个英文字母和(半角逗号半角空格半角句号)按照()里的内容进行分割,遇到大写字母把其变成小写,遇到小写的将其变成大写然后输出字符串
    排序算法
    单例模式
  • 原文地址:https://www.cnblogs.com/zcr-blog/p/15013395.html
Copyright © 2011-2022 走看看