1. 程式人生 > >[XSY 2666][分治FFT][容斥]排列問題

[XSY 2666][分治FFT][容斥]排列問題

在這裡插入圖片描述
在這裡插入圖片描述
yy一個方案有多少對相鄰的相同,顯然是m-顏色段數
我們令 f i , j f_{i,j} 表示前i種顏色分成j段顏色段數的方案數。
注意,我們這裡允許兩個同樣顏色的顏色段相鄰。
可以得到轉移方程 f

i , j = k = 0
j 1
f i 1
, k
( a i 1 j k 1 ) 1 j k f_{i,j}=\sum_{k=0}^{j-1}f_{i-1,k}*\binom{a_{i}-1}{j-k-1}*\frac{1}{j-k}
可以分治FFT完成。
當然,這求出來的不是真正的f。
我們需要執行 f n , i = i ! f n , i ( i ϵ [ 1 , m ] ) f_{n,i}=i!*f_{n,i}(i\epsilon [1,m])
不妨令 g i = f n , i g_{i}=f_{n,i} , a n s i ans_{i} 為分成i段的真正答案(即不允許有同樣顏色的顏色段相鄰)
可以得到容斥式子:
a n s i = g i j = 1 i 1 a n s j ( m j i j ) ans_{i}=g_{i}-\sum_{j=1}^{i-1}ans_{j}*\binom{m-j}{i-j}
考慮繼續化簡。
可以發現, g j g_{j} a n s i ans_{i} 的貢獻為 ( 1 ) i j ( m j i j ) (-1)^{i-j}*\binom{m-j}{i-j}
證明如下(採用歸納證明):
g k > a n s i g_{k}->ans_{i}
= j = k i 1 ( 1 ) j k + 1 ( m k j k ) ( m j i j ) =\sum_{j=k}^{i-1}(-1)^{j-k+1}*\binom{m-k}{j-k}*\binom{m-j}{i-j}
= j = k i 1 ( 1 ) j k + 1 ( m k ) ! ( m j ) ! ( j k ) ! ( m j ) ! ( m i ) ! ( i j ) ! =\sum_{j=k}^{i-1}(-1)^{j-k+1}*\frac{(m-k)!}{(m-j)!(j-k)!}*\frac{(m-j)!}{(m-i)!(i-j)!}
= j = k i 1 ( 1 ) j k + 1 ( m k ) ! ( j k ) ! ( m i ) ! ( i j ) ! =\sum_{j=k}^{i-1}(-1)^{j-k+1}*\frac{(m-k)!}{(j-k)!(m-i)!(i-j)!}
= ( m k ) ! ( m i ) ! ( i k ) ! j = k i 1 ( 1 ) j k + 1 ( i k ) ! ( i j ) ! ( j k ) ! =\frac{(m-k)!}{(m-i)!(i-k)!}\sum_{j=k}^{i-1}(-1)^{j-k+1}*\frac{(i-k)!}{(i-j)!(j-k)!}