靠着手速和沒有 FST 上了大分,很開心(
場上沒時間做 I,還看錯題了。感覺再給我 30min 就可以過了。
把 \(a\) 序列進行划分,每一段內的 \(a\) 值都相等且這個 \(a\) 值等於段的長度。一個序列最多存在一個划分。設這個划分的長度為 \(f_1,f_2,f_3,...,f_m\)。
划分內要求是一個上升/下降段。而划分外部要求相鄰兩個不能組成一個連續段。
自然想到容斥。欽定一些相鄰段能組成連續段,就把 \(f\) 划分成幾個上升/下降段。設這個划分的長度為 \(k\),那么方案數即為 \(k! 2^{\text{長度不為 1 的段個數}}\),容斥系數為 \((-1)^{m-k}\)。
分治 \(\rm FFT\) 即可(對於一個分治中心 維護 l 和 l-1 是否被欽定
和 r 和 r+1 是否被欽定
的關於段數的多項式)
實際實現中,把 "長度和不為 1 的段個數" 轉化成了 \(k\) 減去 "長度和為 1 的段的個數",長度和為 1 的段只有可能是長度為 1 的連續段,很好處理。