Meaning
- 一个长度为 n n n 的序列,每个位置可以被染成 [ 1 , m ] [1,m] [1,m] 中的任一颜色
- 求所有 m n m^n mn 种染色方案的最长连续同色子段长度之和
- 答案对 p p p 取模
- 1 ≤ n ≤ 300000 1\le n\le300000 1≤n≤300000
- 2 ≤ m ≤ 1 0 8 2\le m\le10^8 2≤m≤108
- 0.99 × 1 0 9 ≤ p ≤ 1.01 × 1 0 9 0.99\times10^9\le p\le1.01\times10^9 0.99×109≤p≤1.01×109
- p p p 为质数
- 时限 2s
- 空限 1G
Solution - Step 1
- 神仙 zzq 的题思路果然非常巧妙
- 我们知道,对于值域为非负整数的函数 f ( S ) f(S) f(S) ,有
- ∑ S f ( S ) = ∑ i ≥ 1 ∑ S [ f ( S ) ≥ i ] \sum_Sf(S)=\sum_{i\ge1}\sum_S[f(S)\ge i] S∑f(S)=i≥1∑S∑[f(S)≥i]
- 回到问题。直觉告诉我们,这是与最值有关的计数问题
- 所以根据上面的式子进行转化可以简化问题
- a n s = ∑ S f ( S ) = ∑ i ≥ 1 ∑ S [ f ( S ) ≥ i ] ans=\sum_Sf(S)=\sum_{i\ge1}\sum_S[f(S)\ge i] ans=S∑f(S)=i≥1∑S∑[f(S)≥i]
- 其中 S S S 表示一种染色方案, f ( S ) f(S) f(S) 表示染色方案 S S S 的最长连续同色子段长度
- 容易得出 ∑ S [ f [ S ] ≥ i ] \sum_S[f[S]\ge i] ∑S[f[S]≥i] 表示最长连续同色子段长度 ≥ i \ge i ≥i 的方案数
- 「最大值 ≥ i \ge i ≥i 」还是不好处理,考虑补集转化一下
- ∑ S [ f ( S ) ≥ i ] = m n − ∑ S [ f ( S ) < i ] \sum_S[f(S)\ge i]=m^n-\sum_S[f(S)<i] S∑[f(S)≥i]=mn−S∑[f(S)<i]
- 于是
- a n s = n m n ∑ i = 1 n ∑ S [ f ( S ) < i ] = n m n − ∑ i = 0 n − 1 ∑ S [ f ( S ) ≤ i ] ans=nm^n\sum_{i=1}^n\sum_S[f(S)<i]=nm^n-\sum_{i=0}^{n-1}\sum_S[f(S)\le i] ans=nmni=1∑nS∑[f(S)<i]=nmn−i=0∑n−1S∑[f(S)≤i]
- 发现 ∑ S [ f [ S ] ≤ i ] \sum_S[f[S]\le i] ∑S[f[S]≤i] 实际上就是把长度为 n n n 的序列分成若干段,每段长度都不超过 i i