0
点赞
收藏
分享

微信扫一扫

Subpermutation-2021中国大学生程序设计竞赛(CCPC)- 网络选拔赛(重赛)-1008

静悠 2022-01-12 阅读 101

好久没写过题解了,模了好长时间的题终于过了,由此写篇题解。
题目链接
题意就不详细说明了。
反思

接下来开始分类讨论。

  • 第一种情况也就是最简单的情况先考虑由每个单独 n n n元排列而产生的 m m m元排列,通俗的讲也就是单独的 n n n元排列对答案做出的贡献。
    p 1 , p 2 , … , p n p_1,p_2,\dots,p_n p1,p2,,pn中出现的 p 1 , p 2 , … , p m p_1,p_2,\dots,p_m p1,p2,,pm
    做出的贡献为 m ! ∗ ( n − m + 1 ) ! m!*(n-m+1)! m!(nm+1)!
  • 第二种情况比较复杂也很容易想到也就是两个 n n n元排列的首尾对答案做出的贡献
    下面我们应该分析这个 n n n排列与与下一个 n n n元排列存在这什么恶心关系呢?
    最开始是这样一个 n n n元排列 p 1 < p 2 < p 3 < ⋯ < p n p_1<p_2<p_3<\dots<p_n p1<p2<p3<<pn
    它最终的形式应该是这样的
    p 1 > p 2 > p 3 > ⋯ > p n p_1>p_2>p_3>\dots>p_n p1>p2>p3>>pn
    通过打表或者是其他的分析而得(我是打表
    在一个 n n n元排列里面存在最后一个 < < <关系的 p k < p k + 1 p_k<p_{k+1} pk<pk+1这个 p k p_k pk要被这个排列从后往前数第一个比它大的数替换然后整体倒着来。
    比如一个 n n n元排列是这样的 p 1 < p 2 > p 3 < p 4 < ⋯ < p k < p k + 1 > ⋯ > p j > ⋯ > p n p_1<p_2>p_3<p_4<\dots<p_k<p_{k+1}>\dots>p_j>\dots>p_n p1<p2>p3<p4<<pk<pk+1>>pj>>pn
    假设 p j p_j pj是从右往左数第一个比 p k p_k pk大的元素
    它的下一个排列必然是
    p 1 < p 2 > p 3 < p 4 < ⋯ < p j > p n < p n − 1 < ⋯ < p j + 1 < p k < p j − 1 < ⋯ < p k + 1 p_1<p_2>p_3<p_4<\dots<p_j>p_n<p_{n-1}<\dots<p_{j+1}<p_k<p_{j-1}<\dots<p_{k+1} p1<p2>p3<p4<<pj>pn<pn1<<pj+1<pk<pj1<<pk+1

那你肯定有个 p i p_i pi m m m元排列的起始点

    • 再进行分类讨论当 i ≤ k i\leq k ik
      单独讨论这个排列
      p i … p k , p k + 1 , p k + 2 , … , p j , … , p n , p 1 , p 2 … p i + m − 1 − n p_i\dots p_k,p_{k+1},p_{k+2},\dots,p_j,\dots,p_n,p_1,p_2\dots p_{i+m−1−n} pipk,pk+1,pk+2,,pj,,pn,p1,p2pi+m1n
    • 而当 i ≥ ( k + 1 ) i\geq (k+1) i(k+1)

讨论完毕。
最后答案化简得
( m − 1 ) ∗ m ! ∗ ( n − m ) ! − m ! ∗ ∑ i = 1 m − 1 1 i 2 (m-1)*m!*(n-m)!-m!*\sum_{i=1}^{m-1}{1\over{i^2}} (m1)m!(nm)!m!i=1m1i21

举报

相关推荐

0 条评论