CF1205E
给定字符串 (s),定义 (f(s)) 为其 ( m border) 的数量,令其长度为 (n),字符集为 ([1,k]),求 (f(s)^2) 的期望。答案对 (10^9+7) 取模。
(nle 10^5,kle 10^9)
( m Sol:)
首先如果存在一个长度为 (x) 的 ( m border),那么我们有当前字符串会满足对于 (iin [1,x],s_i=s_{i+(n-x)})
考虑 (f(s)) 的平方,可以考虑经典套路,枚举 ((i,j)) 且 (i,j) 均为 (s) 的 ( m border),那么 ((i,j)) 的对数就是 (f(s)^2)
枚举 (i,j) 不利于计算答案,我们可以考虑枚举 (n-x) 为 ((i,j)),那么对于 (forall kin [1,n-i],s_k=s_{k+i},s_k=s_{k+j}),暴力的做法是考虑枚举 ((i,j)) 然后让 (x) 向 (x+i,x+j) 连一条边,那么贡献即为 (k^{cnt}),其中 (cnt) 为连通块数量。
更进一步,我们不妨设 (a<b),略做观察,我们可以考虑让 (i o i+a) 连一条边,这样可以得到以 (n\% a) 为类的共计 (|a|) 个组。
我们接下来显然只需要保留每个组的开头,即 (iin [1,a]),然后使 (i o i+b) 连边,显然这样即可保证连通性。
显然如果 ([1,a]) 中的点均连了边,我们可以发现此时图会变成 (gcd(a,b)) 个组。
否则,我们发现仅有 ((n-b,a]) 这个区间内的点没有连边,我们假定之前的 (b) 边是将 (\%a) 相同的链串成环,那么其会依次断开每个环的一条边,接着才开始断边,于是我们不难发现,当 (a-(n-b)le gcd(a,b)) 时,边均失效,否则先有 (gcd(a,b)) 条失效边,其余情况可以当作森林的情况计算(点数减去边数),最终我们得到连通块数量为 (gcd(a,b)+max(0,a+b-n-gcd(a,b)) o max(a+b-n,gcd(a,b)))
于是我们统计的答案即:
不妨枚举 (gcd(i,j)=d),计算贡献我们考虑容斥,先假设所有点均取 (i+j-n),那么此时贡献为:
枚举 (i+j),计算其出现次数然后乘以贡献即可,复杂度 (mathcal O(nlog n))
另一边,我们需要修正我们的答案,不难注意到所求为:
由于边界的不同,您可以看到上述式子推导中边界的问题,我们可以将上界先设为 (n),然后减去 (i,j) 分别有一个 (n) 对于答案的贡献。
同时,后者的 (G(T,frac{n-1}{T}+1)) 是我们放缩的一个界,容易验证此界与标准界的误差至多为 (1),所以可以对这个 (1) 的误差进行特判。
接下来预处理 (f(x)),其中 (f(x)=sum_{i,j}^x [i+jle x]),于是我们可以递推 (f),(f(x) o f(x+1)) 相当于增加了 (i+j=x+1) 的数,显然为 (x)
那么我们的瓶颈在于计算 (G(T)),不难注意到内部的 ([(i+j)le ...]) 是一个更严的界,所以我们可以直接考虑每个元素对于答案的贡献次数,显然对于 ((i+j)=x) 其被计算次数为 ((x-1)),那么我们不妨枚举 (T) 然后通过调和级数统计答案即可。
通过预处理 (K^d),我们可以做到 (mathcal O(nlog n))