• FJOI2020 Day2 T2 conv


    Description 

      求将一个凸多边形划分为n个k边形的方案数($mod$ $10^9 + 7$)

    Solution

      ps:看了兔队的游记,但由于太菜推了好久才懂,稍微记录下

      原凸多边形的边数是$n imes(k-2)+2$(因为$n$个$k$边形的顶点都在原凸多边形顶点上,它们的内角和等于原凸多边形内角和),不过这东西并没有任何卵用

      划分时,原凸多边形的每条边都会成为某个$k$边形的边

      因此我们先选定某条边,然后再在原凸多边形上再选择$k-2$个点,把这$k$个点构成的$k$边形取走后原凸多边形被划分为$k-1$个凸多边形(当然有些变成0个点直接忽略掉)

      取的时候要保证拆分后的凸多边形划分成$k$边形后不会有剩余

      方程为 $f(n,k)=sum f(a_1,k)  imes f(a_2,k)  imes cdots  imes f(a_{k-1},k)$ ,( $sum_{i=1}^{k-1} a_i == n - 1$ )

      这样得到一个$O(n^k)$的暴力

      方程长得有点像Catalan数,多了几重枚举

      他们说这是K-Catalan数,但是百度好像没什么人写,找到一篇英文的但是看不懂

      然后就对着结论瞎猜

      兔队算的是由$n$个$+(k-2)$和$n(k-2)$个$-1$组成的任意前缀和都大于等于0的序列数

      想想好像等价于上面的方程式,$n=0$ or $1$时, $f(0,k)=f(1,k)=1$ 显然满足两者等价,$n>1$时相当于在序列的开头放一个$+(k-2)$,在后面总共$n imes(k-1)-1$个位置中任意选取$(k-2)$个位置放入$-1$,这样就把整个序列分割成$k-1$段(目前已放入的位置相邻两个之间为一段,包含为空的段),对于每种确定的分割方案对总方案贡献为$f(a_1,k)  imes f(a_2,k)  imes cdots  imes f(a_{k-1},k)$, 这样枚举每种分割方案后相加得到总方案可以保证不重不漏

      稍微转化一下,改成计算由$n$个$+(k-2)$和$n(k-2)+1$个$-1$组成的(除最后一个位置外)任意前缀和都大于等于0的序列数

      这里先放下结论:$$ans=frac{1}{nk-n+1}inom{nk-n+1}{n}$$

      

      $inom{nk-n+1}{n}$算的显然是任意排列的序列数

      乘上$frac{1}{nk-n+1}$是因为对于每$nk-n+1$个循环同构的序列中有且仅有一个序列合法

      对于每种不合法的序列,我们可以找到它的前缀和最小的位置$pos$(有多个取最靠前的那个),将[1,pos]和[pos+1,nk-n+1]对调,得到一个与它循环同构的合法序列

      对于每种合法序列,任意后缀和均小于0,无论将哪个后缀调到前面都会把序列变为非法

      这样可以推出每$nk-n+1$个循环同构的序列中有且仅有一个序列合法

      (写得好啰嗦,博客新人大家体谅下,如果哪里写错了欢迎指出)

      (听说还有一种生成函数的推法,不过好像要解一个$xg(x)^{k-1}-g(x)+1=0$的$k-1$次方程再展开,不会呜呜呜。这个方程可以解吗,还是用的其它方法,又或者我方程推错了??(不过我验证了k=3似乎没问题,往上就不会了)。求路过的大佬指点下)

      

  • 相关阅读:
    Standalone集群搭建和Spark应用监控
    日志信息和浏览器信息获取及数据过滤
    Spark词频前十的统计练习
    Spark-local本地环境搭建
    冒泡排序java
    java反编译
    修改系统环境变量 cmd命令
    java单元测试(Junit)
    spring改版官网下载jar包, 源代码和文档
    打开 chm 帮助文件显示空白及解决方法
  • 原文地址:https://www.cnblogs.com/Urushibara-Ruka/p/13222493.html
Copyright © 2020-2023  润新知