問題描述輸入格式小 z 是乙個很有名的建築師,有一天他接到了乙個很奇怪的任務:在數軸上建 n 個建築,每個建築的高度是 1 到 n 之間的乙個整數。
小 z 有很嚴重的強迫症,他不喜歡有兩個建築的高度相同。另外小 z 覺得如果從最左邊(所有建築都在右邊)看能看到 a個建築,從最右邊(所有建築都在左邊)看能看到 b 個建築,這樣的建築群有著獨特的美感。現在,小 z 想知道滿足上述所有條件的建築方案有多少種?
如果建築 i 的左(右)邊沒有任何建造比它高,則建築 i 可以從左(右)邊看到。兩種方案不同,當且僅當存在某個建築在兩種方案下的高度不同。
第一行乙個整數 t,代表 t 組資料。輸出格式接下來 t 行,每行三個整數 n,a,b
對於每組資料輸出一行答案 mod10^9+7。樣例輸入 1
2樣例輸出 13 2 2
3 1 2
2樣例輸入 21
5樣例輸出 21 1 1
2 1 1
4 3 1
10 2 2
8 6 4
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...