DTOJ 4751. 女裝

題意

原題題目:生而爲人的目的是體驗生活百態,所以每個男孩的衣櫃裏都應該偷偷藏一套女裝

由於小A女裝的慾望日益強烈,並且他進隊的機率日益提升,已經到了 99.99999...25111549%99.99999...(2511154個9)\%,所以AlseoR提議準備給小A一個驚喜。機房人民集資買了 nn 件衣服,編號爲 11 的衣服是小A最喜歡的女裝。

小A擺放物品時有個習慣,不喜歡打亂原先物品的位置,因此小A家的衣櫃只能從兩側打開,可以從左邊放衣服進去也可以從右邊放衣服進去,並且會把之前已經在衣櫃裏的衣服往中間擠。比如衣櫃裏面已經有 1,2,31,2,3 三件衣服了,現在從左邊放一件 44 號衣服進去就變成了 4,1,2,34,1,2,3,在右邊放一件 55 號女裝就變成了4,1,2,3,54,1,2,3,5 。現在AlseoR帶着機房人民集資爲小A買的n件衣服潛入了小A的家,將衣服按編號從小到大放進衣櫃,每次可以任意選擇左側或者右側放入。

但是小A作爲一個強迫症,他希望可以存在一種方式從衣櫃兩側不斷取出衣服(取完爲止),每次可以任意選擇將左側的衣服或者右側的取出,第 KK 件可以取出女裝。所以他想問問你方案的總數。由於小A不知道衣櫃裏面的衣服是怎麼擺放的,所以他只關心取出的順序。即對於兩個方案不同,當且僅當存在一個 xx ,兩個方案取出的第 xx 件衣服編號是不同的。當然這個數可能很大,所以小A決定從他最喜歡的三個數中選一個給你當模數。

數據編號 N,MN,M TT\le Mod=Mod=
1 10 10 19260817
2 10 10 698786049962
3 5000 5000 698786049962
4 5000 5000 325497727
5 5000 5000 325497727
6 10610^6 10410^4 19260817
7 10910^9 10410^4 19260817
8 10910^9 10410^4 325497727
9 10910^9 10410^4 698786049962
10 10910^9 10410^4 698786049962

題解

直觀地考慮取出衣服的過程:一開始兩端有一段是nn,如果取出nn就轉化爲n1n-1的問題,否則如果取出的另一端是xx,那麼x+1,...,nx+1,...,n按照從裏到外排列在另一端,即下一次取或者取nn,或者取的數<x<x。於是考慮DP:設f[i][j][k]f[i][j][k]1i1…i中後面j個數不能取(i除外),取了kk次的方案數,答案即爲f[n][1][k1]2max(nk1,0)f[n][1][k-1]*2^{max(n-k-1,0)}
前綴和優化轉移是O(n3)O(n^{3})的,但發現f[i][j][k]f[i][j][k]f[i1][x][k1]f[i-1][x][k-1]轉移過來,且轉移過程類似於作後綴和。由此想到組合意義,畫成路徑可發現f[n][1][k1]=C(k+n2,k1)C(k+n2,n)f[n][1][k-1]=C(k+n-2,k-1)-C(k+n-2,n)
此處必須吐槽一下部分分,沒有給樸素的DP應有的分,必須化成組合意義纔有分,而3,4,5三個點又誤導人往O(n2)O(n^{2})去想(實際上是方便求組合數),令選手十分自閉(雖然本質上是我弱智,沒有及時發現比較顯然的轉移規律)。
後面就是exlucasexlucas了,不會數論的我強行yy了一下,想錯了好幾次調了半天。大概就是把PP唯一分解,求出n!%pikin!\% p_i^{k_i}的值後crtcrt合併一下。求n!%pikin!\% p_i^{k_i}的時候,先把n!n!pp的倍數提出來,把它們各提取一個pp後遞歸下去算剩下的值,剩下不是pp的倍數的數可以按照pkp^{k}分爲若干段,因爲這裏的pp對應的pkp^k不會很大,直接預處理即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章