本省省選題是需要做的。
題目傳送門:洛谷p4609。
題意簡述:
求有多少個 \(1\) 到 \(n\) 的排列,滿足比之前的所有數都大的數正好有 \(a\) 個,比之後的所有數都大的數正好有 \(b\) 個。
答案對 \(mod=10^9+7\) 取模。
有 \(t\) 組資料。
題解:
考慮最大的元素 \(n\) ,它把序列分成兩部分。
考慮左邊的一部分,它滿足比之前所有數都大的數正好有 \(a-1\) 個,右邊同理。
把每個比之前所有數都大的數和其右邊比它小的連續一段的數分為一組,則左邊有 \(a-1\) 組。
每一組中,最大的元素要放在最左邊,其餘的排列方式隨意,所以是乙個圓排列,即有代表元素的排列。
這提示我們考慮第一類斯特林數。
把左邊和右邊合起來考慮,總共 \(n-1\) 個元素,分成 \(a+b-2\) 個圓排列,也就是 \(\mathbf_^\) 。
但是這些圓排列中,需要選取 \(a-1\) 個放在左邊一部分,右邊的放剩下的,也就是 \(\mathbf_^\) 。
注意到確定了一部分放置哪些圓排列後,這一部分的圓排列順序就確定了。
所以答案就是 \(\mathbf_^\mathbf_^\) 。
因為資料範圍不大,暴力預處理第一類斯特林數和組合數即可。
1//第一類斯特林數 (stirling number of the first type)2//
將 n 個有標號元素 分為 m 個 圓排列 (無序) 的方案數 記作 s(n,m)3//
圓排列 : 輪換相同的視作相同的排列。4//
圓排列的實際意義 : 有代表元素的排列 , 例如代表元素為最大元素5//
s(n,m) = s(n-1,m-1) + (n-1)*s(n-1,m)6//
考慮第 n 個元素 , 單獨成乙個排列 , 或者在前 n-1 個元素中的任意乙個的左側插入7//
邊界 : s(0,0)=1 , s(n,0)=0
89 #include 10
11 typedef long
long
ll;12
const
int mod = 1000000007;13
14int s[50005][205], c[205][105
];15
16void
init() 22}
2324 c[0][0] = 1;25
for (int i = 1; i <= 200; ++i) 30}
3132
intmain()
41return0;
42 }
洛谷P4609 FJOI2016 建築師
小 z 是乙個很有名的建築師,有一天他接到了乙個很奇怪的任務 在數軸上建 n 個建築,每個建築的高度是 1 到 n 之間的乙個整數。小 z 有很嚴重的強迫症,他不喜歡有兩個建築的高度相同。另外小 z 覺得如果從最左邊 所有建築都在右邊 看能看到 a 個建築,從最右邊 所有建築都在左邊 看能看到 b ...
洛谷P2827,NOIP2016 蚯蚓
傳送門 考慮優先佇列 但是蚯蚓的長度是變化的,如果每一次操作都修改所有蚯蚓的長度,必然超時.但是每一次所有蚯蚓中,只有被斬斷生成的兩個沒有 q,其它所有蚯蚓長度均 q.不難想到,用優先佇列 兩個值 len表示被壓入優先佇列時的長度,t表示被壓入優先佇列的時間,如果當前時間為i,那麼當前蚯蚓的實際長度...
洛谷P2827 NOIP2016 蚯蚓
題目描述 輸入 輸出 思路分析 70分寫法 看到每次取出最大值,第一眼想到的就是優先佇列,我們可以每一次取完隊首元素後將其分開後兩段的長度進行計算,再放入佇列之中即可 但題目中要求,除被切開的蚯蚓外,其餘蚯蚓長度要變長,每次把隊中元素取出並加上q再放入隊中?不用說我們也知道這是不行的,那我們可以 考...