【題目背景】測試
牆角那株海棠,是你種下的思念。
生死不能忘,高燭照容顏。
一曲江城唱晚,重憶當年坐燈前,
青衫中繡着你留下的線。
——銀臨《江城唱晚》優化
【問題描述】spa
扶蘇是個喜歡一邊聽古風歌一邊寫數學題的人,因此這道題實際上是五三原題。
歌曲中的主人公看着牆邊的海棠花,想起當年他其實和本身沿着牆邊種了一排海
棠,可是現在都已枯萎,只剩下那一株,寄託着對他深深的思念。
沿着牆一共有$ n \(個位置能夠種下海棠花,主人公記得本身當年和他一共種下了\) m
\(朵,因爲花的特性,海棠不能緊挨着種植,也就是兩朵海棠花之間最少間隔一個不種花 的空位置。可是她記不清當時海棠花具體是怎麼擺放的了,因此她想知道一共有多少方 案使得\) m \(朵海棠花都被種下且兩兩之間不是相鄰的。咱們將這\) m $朵海棠花按照
$1,2,3…m \(的順序編號,兩個種花的方案不一樣當且僅當它們被種下的位置不一樣或者從左向 右數花的編號序列不一樣。 爲了不輸出過大,答案對一個參數\) p $取模數學
【輸入格式】table
輸入文件中有且僅有一組數據,只有一行四個數字,分別表明 \(type,n,m,p\)。其中
\(type\) 是一個幫助你判斷測試點類型的參數,會在數據範圍中說明。class
【輸出格式】原理
輸出一行一個數字,表明答案對$ p $取模的結果。方法
【輸入輸出樣例】數據
$1 3 2 19260718 $tab
\(2\)
【輸入輸出樣例解釋】
一共有兩朵花,3 個位置。若是給花朵編號爲 1,2,位置編號爲 1,2,3,那麼兩種
方案分別以下:
位置$ 1 2 3$
方案\(1\) 花朵$1\space N/A $花朵\(2\)
方案\(2\) 花朵\(2\) $N/A $花朵\(1\)
【數據規模與約定】
子任務編號 | n\(\leq\) | m\(\leq\) | type= | 特殊性質 | 子任務分值 |
---|---|---|---|---|---|
1 | 1 | 1 | 0 | 特殊性質1 | 5 |
2 | 20 | 20 | 1 | 特殊性質1 | 15 |
3 | 400 | 200 | 2 | 無 | 20 |
4 | 2000 | 1000 | 3 | 無 | 20 |
5 | 2000000 | 1000000 | 4 | 特殊性質2 | 20 |
6 | 2000000 | 1000000 | 5 | 無 | 20 |
特殊性質\(1\):保證對應測試點的實際方案數(在取模以前)不超過\(10^6\)。
特殊性質\(2\):保證對應測試點的模數\(p\)是一個質數。定義整數\(x\)是一個質數當且僅當\(x\)有且只有\(1\)和\(x\)兩個因數。
對於\(100\)%的數據,保證\(1\leq p\leq 10^9\),\(1\leq m\leq \lceil \frac{n}{2} \rceil \leq 10^6\),其中\(\lceil x \rceil\)爲不小於\(x\)的最小整數。
【題解】
前言:\(zay\)神仙是把每個子任務的方法都講了一遍,這裏主要講\(60\)分的版本(\(DP\))和\(100\)分的版本(組合數學)
\(60\)分思路:
首先設\(f_{i,j}\)表示前\(i\)朵花按順序種下,第\(i\)朵花種在第\(j\)個位置上的方案數。因而有\(\sum_{k=1}^{j-2}{f_{i,k}}\),可是沒有考慮花的序號,因此要再乘上\(n!\)。時間複雜度爲\(O(n^2m)\)顯然只能過第三個子任務。
接下來考慮優化,咱們能夠用一個\(G_{i,j}\)用來維護\(\sum_{k=1}^{j-2}{f_{i,k}}\),則有\(f_{i,j}=g{i,j-2}\)。因而複雜度降到\(O(nm)\)。就不會出現這個結果了。可是也只能拿\(60\)分。
\(100\)分思路及代碼:
考慮最後一個位置不種花的狀況,這意味着每一朵花後面都跟了一個空位。咱們將花和它後面的空位當作同一個 物體,則問題變成了有$ (n-m) \(個位置,放\) m \(個物體,放置無限制。根據組合數的定義,這樣選位置的方案數爲\)C_{n-m}^{m}$。注意到這樣仍然是不考慮花的序號的,要再乘上 \(m!\)。
考慮最後一個位置放花的狀況,這意味着除了最後一朵花後面都跟了一個空位,咱們去掉最後一個位置,剩下的花和後面的空位當作同一個物體,則同上能夠計算方案數是\(C_{n-m}^{m-1}\)。一樣要乘上$ m!\(。 根據加法原理,總方案數爲\)$ m!(C_{n-m}^{m}+C_{n-m}^{m-1}) $\(。 因爲模數是質數,預處理階乘求一下階乘逆元,便可作到\)O(n log P)$。可是隻能過到第5個點。
若是你足夠機智,能夠發現上面的式子能夠這麼化:
\[m!(C_{n-m}^{m}+C_{n-m}^{m-1})=m!C_{n-m}^{m}+m!C_{n-m}^{m-1}=A_{n-m}^{m}+mA_{n-m}^{m-1}\]
因而不用求逆元,直接求A便可。
固然,因爲代數恆等式 \(A_x^y+yA_x^{y-1}=A_{x+1}^y\),能夠直接求\(A_{n-m+1}^m\) 。
這樣就能夠\(A\)了這道題了。