有高为1,2,3,...,n的杆子各一根排成一行。从左边能看到l根,从右边能看到r根,求有多少种可能。 (l,r <= 200,n <= 200000)
给出T 组数据 (T <= 500000) 对于每一组数据输出可能的个数,为避免写高精,将答案模 1e9 + 7 (它为质数,但似乎没蛋用)
关于 O(TnLR) 或 O(nMAX(L,R)) 预处理,O (n) 查询的解法已有,现在我来安利安利汪神的无敌解法,我现在只服汪神!!!
先说答案,答案为s(n-1,l+r-2) * C(l + r - 2,l - 1) (s为第一类斯特林数,c为组合数)
证明
图中画出的柱子是能被看出的,每根柱子后面一定有比它小的柱子,但这些柱子随便怎么排都无所谓,所以对于一根柱子来说,设它和它背后比它低的柱子个数为k。
那么比它低的柱子有k-1个,排列方式为(k-1)!
设能被看到的柱子和后面比它低的柱子为一个集合,那么全场共有(l + r - 2) 个集合(忽略最高的柱子)。只要我们找出了这(l + r - 2)个集合,那么就一定能构成上图(每个集合最高的柱子作为这个集合的代表)
那么我们找出这(l+r-2)个不同的集合的方案数为s(n-1,l+r-2)。为什么是这样呢?
显然,对于一个集合而言,如果其他l+r-3个集合不变,那么他就一定会变,因为是找圆排列,它只会变(k-1)! 次(k为此集合大小)。。。
刚好这个集合除了代表元素也只有(k-1)!种排列,所以是正确的。。。(我不知道之前的算不算口胡,汪神说只可意会,是非完美证明)
我们在选出的(l+r-2)个中选出l-1个作为左边的就好了 因此就乘上组合数