[2018 FJ 省队集训 Day6][校内训练]传统题(组合数学妙题)

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 1n300000
  • 2 ≤ m ≤ 1 0 8 2\le m\le10^8 2m108
  • 0.99 × 1 0 9 ≤ p ≤ 1.01 × 1 0 9 0.99\times10^9\le p\le1.01\times10^9 0.99×109p1.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] Sf(S)=i1S[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=Sf(S)=i1S[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 ) &lt; i ] \sum_S[f(S)\ge i]=m^n-\sum_S[f(S)&lt;i] S[f(S)i]=mnS[f(S)<i]
  • 于是
  • a n s = n m n ∑ i = 1 n ∑ S [ f ( S ) &lt; i ] = n m n − ∑ i = 0 n − 1 ∑ S [ f ( S ) ≤ i ] ans=nm^n\sum_{i=1}^n\sum_S[f(S)&lt;i]=nm^n-\sum_{i=0}^{n-1}\sum_S[f(S)\le i] ans=nmni=1nS[f(S)<i]=nmni=0n1S[f(S)i]
  • 发现 ∑ S [ f [ S ] ≤ i ] \sum_S[f[S]\le i] S[f[S]i] 实际上就是把长度为 n n n 的序列分成若干段,每段长度都不超过 i i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值