FJOI2016 建築師 斯特林數

2022-03-27 09:58:17 字數 1885 閱讀 6499

問題描述

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

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

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

輸入格式

第一行乙個整數 t,代表 t 組資料。

接下來 t 行,每行三個整數 n,a,b

輸出格式

對於每組資料輸出一行答案 mod10^9+7。

樣例輸入 1

2

3 2 2

3 1 2

樣例輸出 1

2

1

樣例輸入 2

5

1 1 1

2 1 1

4 3 1

10 2 2

8 6 4

樣例輸出 2

1

0 3

219168

0

提示

對於 10% 的資料 : 1≤n≤10

對於 20% 的資料 : 1≤n≤100

對於 40% 的資料 : 1≤n≤50000, 1≤t≤5

對於 100%的資料 :1≤n≤50000, 1≤a,b≤100, 1≤t≤200000

顯然最高的那個一定看得見放在**都一樣,我們不管它。

然後考慮最高的桿子左邊的部分(右邊同理)

每兩個看得見的桿子之間都可能會有被擋住的桿子,我們把乙個看得見的桿子和它擋住的桿子看成乙個集合,假設這個集合大小為c,那麼在確定集合元素的情況下,

這個集合的排列的方案數實際上就是c個元素圓排列的方案數。因為乙個圓排列都對應且僅對應乙個合法排列(因為最高的桿子肯定在最左邊所以肯定是從最高的杆

子這裡斷開),所以問題就變成了把n-1個桿子分成a+b-2個圓排列的方案數(因為最高的桿子左邊有a-1個這樣的集合,右邊有b-1個),就

是$s(n-1,a+b-2)$。當然對於每種分法我們要確定這個圓排列是在左邊還是在右邊,所以要乘上$c(a+b-2,a-1)$。

答案就是$s(n-1,a+b-2)*c(a+b-2,a-1)$,預處理一下$o(1)$回答就好了。

1 #include2 #include3 #define rep(i,l,r) for (int i=l; i<=r; i++)

4 using namespacestd;

5 6 const int mod=1000000007,m=210,n=50010;

7 ints[n][m],c[m][m],t,n,a,b;

8 9 void init(int n,inta)

15 rep(i,0,a)

19 }

20 21 intmain()

洛谷P4609 FJOI2016 建築師

小 z 是乙個很有名的建築師,有一天他接到了乙個很奇怪的任務 在數軸上建 n 個建築,每個建築的高度是 1 到 n 之間的乙個整數。小 z 有很嚴重的強迫症,他不喜歡有兩個建築的高度相同。另外小 z 覺得如果從最左邊 所有建築都在右邊 看能看到 a 個建築,從最右邊 所有建築都在左邊 看能看到 b ...

洛谷 P4609 FJOI2016 建築師

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

刷題 2 FJOI2015 建築師

求1 n的全排列構成的建築裡裡,有多少個排列,從左邊看能看到a個,右邊看能看到b個 一看資料範圍 n 50000 資料組數t 200000 覺得找規律 於是乎 暴力找規律 include include include include const int mod 1000000007 int vis...