• [数学最安逸][UVa1638改编][第一类斯特林数+组合数]杆子的排列


    有高为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个作为左边的就好了 因此就乘上组合数

  • 相关阅读:
    第二节:Java环境变量配置
    第一节:VS充当IIS的配置步骤(VS2017和VS2019)
    .Net进阶系列(21)-跨域请求
    02-Unity深入浅出(二)
    第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)
    01-Unity深入浅出(一)
    第十二节:SQLServer存储过程详解及EFCore调用
    Android 组件系列-----Activity的传值和回传值
    Access大数据高效分页语句
    C#清除HTML样式
  • 原文地址:https://www.cnblogs.com/dcoi-king/p/5353658.html
Copyright © 2020-2023  润新知