[关闭]
@y20070316 2017-04-25T08:28:45.000000Z 字数 1962 阅读 907

BZOJ 4714 - 旋转排列

题目精选 容斥原理 组合数学



相关链接

题目: http://www.lydsy.com/JudgeOnline/problem.php?id=4714
题解: https://zyqn.tech/?p=3158

题意


前置技能

环排列数

  我们定义 个数的环排列数.
  我门固定第一个位置不动, 所以

错位排列数

定义

  我们定义 个数的错位排列数.

算法1: 递推

  枚举 所在的连通块的大小, 进行使用递推的方法求解.


  这种计算的方法还是太麻烦啦, 我们考虑继续化简.

  边界:

算法2: 二项式反演

  二项式反演:


  证明:

  我们考虑求解 个元素的排列方案数.
  方法1:
  方法2: 枚举错位的个数, 其余在原本的位置上.



分析

  先分析一下两个条件分别是什么意思.
  条件1: 错位排列.
  条件2: 将一个排列 看做一个置换, 那么要求置换存在一个循环节的大小为 .
  所以

  考虑如何计算 .
  我们可以使用容斥原理: 强制存在一个循环节的大小为 的方案数, 减去强制两个循环节大小为 的方案数, 加上强制存在三个循环节大小为 的方案数,...,加(或减)上强制存在 个循环节大小为 的方案数.
  那么, 如果强制存在 个循环节大小为 的方案数能在 算出来, 就可以在 的复杂度内算出答案了.

  考虑强制存在 个循环节大小为 的方案数如何计算:


   表示将 个数划分到 个循环, 每个循环的大小为 的方案数, 它可以递推处理:

小结

  这道题我之所以没想到, 是因为不知道怎么求 , 始终想着用已有的结论来求, 没想到可以用陌生的东西求陌生的东西, 直接递推.

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注