1. 程式人生 > >[2018 FJ 省隊集訓 Day6][校內訓練]傳統題(組合數學妙題)

[2018 FJ 省隊集訓 Day6][校內訓練]傳統題(組合數學妙題)

Meaning

  • 一個長度為 n n 的序列,每個位置可以被染成 [ 1 , m
    ] [1,m]
    中的任一顏色
  • 求所有 m n m^n 種染色方案的最長連續同色子段長度之和
  • 答案對 p
    p
    取模
  • 1 n 300000 1\le n\le300000
  • 2 m 1 0 8 2\le m\le10^8
  • 0.99 × 1 0 9 p 1.01 × 1 0 9 0.99\times10^9\le p\le1.01\times10^9
  • p p 為質數
  • 時限 2s
  • 空限 1G

Solution - Step 1

  • 神仙 zzq 的題思路果然非常巧妙
  • 我們知道,對於值域為非負整數的函式 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]
  • 回到問題。直覺告訴我們,這是與最值有關的計數問題
  • 所以根據上面的式子進行轉化可以簡化問題
  • 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]
  • 其中 S S 表示一種染色方案, f ( S ) f(S) 表示染色方案 S S 的最長連續同色子段長度
  • 容易得出 S [ f [ S ] i ] \sum_S[f[S]\ge i] 表示最長連續同色子段長度 i \ge i 的方案數
  • 「最大值 i \ge i 」還是不好處理,考慮補集轉化一下
  • S [ f ( S ) i ] = m n S [ f ( S ) < i ] \sum_S[f(S)\ge i]=m^n-\sum_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]
  • 發現 S [ f [ S ] i ] \sum_S[f[S]\le i] 實際上就是把長度為 n n 的序列分成若干段,每段長度都不超過 i i ,最後給每段染上 [ 1 , m ] [1,m] 內的顏色,相鄰段不能染同色的方案數
  • 先列舉段數 j j
  • 如果我們已經確定了劃分方案,那麼染色方案數顯然是 m ( m 1 ) j 1 m(m-1)^{j-1}
  • 然後如果沒有每段長度不超過 i i 的限制,那麼劃分方案數為 ( n 1 j 1 ) \binom{n-1}{j-1}
  • 如果加上了限制,我們可以考慮容斥
  • 即考慮 j j 段中的一部分段,讓這些段的長度強行超過 i i
  • 也就是
  • k = 0 j ( 1 ) k ( j k ) ( n i k 1 j 1 ) \sum_{k=0}^j(-1)^k\binom jk\binom{n-ik-1}{j-1}
  • 其中 ( 1 ) k (-1)^k 為容斥係數, ( j k ) \binom jk 表示 j j 段中選 k k 段讓這些段長度強行超過 i i ( n i k 1 j 1 ) \binom{n-ik-1}{j-1}