洛谷P4609 FJOI2016 建築師

2022-02-27 06:10:16 字數 1994 閱讀 8287

小 z 是乙個很有名的建築師,有一天他接到了乙個很奇怪的任務:在數軸上建 \(n\) 個建築,每個建築的高度是 \(1\) 到 \(n\) 之間的乙個整數。

小 z 有很嚴重的強迫症,他不喜歡有兩個建築的高度相同。另外小 z 覺得如果從最左邊(所有建築都在右邊)看能看到 \(a\) 個建築,從最右邊(所有建築都在左邊)看能看到 \(b\) 個建築,這樣的建築群有著獨特的美感。現在,小 z 想知道滿足上述所有條件的建築方案有多少種?

如果建築 \(i\) 的左(右)邊沒有任何建造比它高,則建築 \(i\) 可以從左(右)邊看到。兩種方案不同,當且僅當存在某個建築在兩種方案下的高度不同。

輸入格式:

第一行乙個整數 \(t\),代表 \(t\) 組資料。 接下來 \(t\) 行,每行三個整數 \(n,a,b\)。

輸出格式:

對於每組資料輸出一行答案 \(\text 10^9+7\)。

輸入樣例#1:

23 2 2

3 1 2

輸出樣例#1:21

對於 \(10 \%\) 的資料 : \(1 \leq n \leq 10\)。

對於 \(20 \%\) 的資料 : \(1 \leq n \leq 100\)。

對於 \(40 \%\) 的資料 : \(1 \leq n \leq 50000, \ 1 \leq t \leq 5\)。

對於 \(100 \%\) 的資料 :\(1 \leq n \leq 50000, \ 1 \leq a, b \leq 100, \ 1 \leq t \leq 200000\)。

題解:

首先來介紹一下斯特林數

這裡只需要用到第一類斯特林數.

其實第一類斯特林數\(s(n, m)\)所代表的意義就是將\(n\)個數分成\(m\)個圓排列的方案數.我們知道\(s(n, m)=s(n-1, m-1)+(n-1)*s(n-1, m)\)可以這樣理解,我們分兩種情況討論方案數,如果新加入乙個數:

讓它單獨組成乙個環,方案數為\(s(n-1,m-1)\).

將它放在之前\(n-1\)個數的左邊,方案數為\((n-1)*s(n-1, m)\).

既然了解了斯特林數的含義,那麼這裡就可以拿來用了.

考慮找到最高的建築,它一定會將左右兩遍分成兩個部分,且左邊可以看見\(a-1\)個建築,右邊可以看見\(b-1\)個建築.

那麼除去我們挑出來的最高的建築,還剩下\(n-1\)個建築,我們需要將這\(n-1\)個建築分成\(a+b-2\)個建築群.乙個建築群指的是一棟可以被看見的建築和在它後面被擋住的建築.就像下面這張圖紅色框框內的建築:

我們知道,建築群需要讓最高的建築在最邊上,這樣才能保證這個建築群內的建築只有一座被看見,所以,乙個建築群內的排列相當於是乙個圓排列(圓排列是經過旋轉之後不相同的排列,也就是說圓排列中的任意乙個排列都可以通過旋轉來讓最高的在最邊緣).

然後產生了\(a+b-2\)個建築群之後,我們需要選\(a-1\)個放在最高的建築的左邊,也就是\(c(a+b-2, a-1)\).

所以最後的答案就是\(c(a+b-2, a-1)*s(n-1, a+b-2)\),先預處理一下就可以\(o(1)\)回答了.

記得要開\(long\ long\)

#includeusing namespace std;

const int n = 5e4+5;

const int nn = 200+5;

const int mod = 1e9+7;

typedef int _int;

#define int long long

int t, n, a, b, c[nn][nn], s[n][nn];

_int main()

return 0;

}

洛谷 P4609 FJOI2016 建築師

本省省選題是需要做的。題目傳送門 洛谷p4609。題意簡述 求有多少個 1 到 n 的排列,滿足比之前的所有數都大的數正好有 a 個,比之後的所有數都大的數正好有 b 個。答案對 mod 10 9 7 取模。有 t 組資料。題解 考慮最大的元素 n 它把序列分成兩部分。考慮左邊的一部分,它滿足比之前...

洛谷P2827,NOIP2016 蚯蚓

傳送門 考慮優先佇列 但是蚯蚓的長度是變化的,如果每一次操作都修改所有蚯蚓的長度,必然超時.但是每一次所有蚯蚓中,只有被斬斷生成的兩個沒有 q,其它所有蚯蚓長度均 q.不難想到,用優先佇列 兩個值 len表示被壓入優先佇列時的長度,t表示被壓入優先佇列的時間,如果當前時間為i,那麼當前蚯蚓的實際長度...

洛谷P2827 NOIP2016 蚯蚓

題目描述 輸入 輸出 思路分析 70分寫法 看到每次取出最大值,第一眼想到的就是優先佇列,我們可以每一次取完隊首元素後將其分開後兩段的長度進行計算,再放入佇列之中即可 但題目中要求,除被切開的蚯蚓外,其餘蚯蚓長度要變長,每次把隊中元素取出並加上q再放入隊中?不用說我們也知道這是不行的,那我們可以 考...