Problem Statement

Let us define the oddness of a permutation $p = \{p_1, p_2, \dots, p_n\}$ of $\{1, 2, \dots, n\}$ as $\sum_{i=1}^{n} | i - p_i |$. Find the number of permutations of $\{1, 2, \dots, n\}$ of oddness $K$, modulo $10^9+7$.

Constraints

  • $1 \le n \le 50$
  • $1 \le K \le n^2$

Observation ①
$\sum_{i = 1}^{n} p_i - i = 0$ $\implies$ $\sum_{i = 1}^{n} | p_i - i |$ 是偶数。
进一步有 $\sum_{p_i > i} p_i - i = \sum_{p_i < i} i - p_i = \dfrac{\sum_{i = 1}^{n} | p_i - i |}{ 2}$

Approach

以下内容参考了这篇题解 http://kazune-lab.net/contest/2019/07/20/abc134/

左边的圆形代表数字,右边的方形代表盒子,方形右边的数字是盒子的编号。箭头表示将数字放入盒子中。将 $p_i$ 看成数字 $i$ 所在的盒子的编号。

Observation ②
$|p_i - i|$ = 连接数字 $i$ 与盒子 $p_i$ 的线与 $n - 1$ 条水平虚线 $\ell_1, \ell_2, \dots, \ell_{n-1}$ 的交点数目。

以上图为例,$n = 5$,共有四条水平虚线。

令 $a_j$ 表示连接 $i$ 与 $p_i$ 且 $i < p_i$ 的那些线与第 $j$ 条水平虚线 $\ell_j$ 的交点个数。
以上图为例,满足条件的线有三条(即加粗的那三条线),$a_1 = 1, a_2 = 2, a_3 = 2, a_4 = 1$ 。

Observation ③
$\sum_{i = 1}^{n - 1} a_i = \sum_{i < p_i} p_i - i = \dfrac{\sum_{i = 1}^{n} | p_i - i |}{ 2}$

可以把往盒子里放数字的过程看作下述 $n$ 阶段决策过程。笼统地说,在第 $i$ 个阶段考虑数字 $i$ 和编号为 $i$ 的盒子如何处置。
把在阶段 $i$ 完成之后 $1, 2, \dots, i$ 这些数字中尚未确定要放进哪个盒子的那些数字的集合记作 $S$,初始时 $S$ 为空。
阶段 $i$ 由下述伪代码所描述:

$\mathtt{if}$ 要把 $i$ 放进 $i$ 号盒子
$\qquad$ 把 $i$ 放进 $i$ 号盒子
$\mathtt{elif}$ $S \ne \emptyset$
$\qquad\mathtt{if}$ 要把 $i$ 放到某个编号小于 $i$ 的盒子
$\qquad\qquad$ 确定把 $i$ 放进哪个盒子并把 $i$ 放进去
$\qquad\mathtt{else}$
$\qquad\qquad$ 把 $i$ 加入 $S$
$\qquad\mathtt{if}$ 要把 $S$ 中的某个数放进盒子 $i$
$\qquad\qquad$ 选一个数放进盒子 $i$ 并将其从 $S$ 中删除
$\mathtt{else}$
$\qquad$ 把 $i$ 加入 $S$

以三元组 $(i, j, k)$ 表示第 $i$ 个阶段结束后的状态:

  • $j := |S|$(即 $1$ 到 $i$ 这些数中有 $j$ 个要放到编号大于 $i$ 的盒子里)
  • $k := \sum_{t = 1}^{i} a_t$ 。

当阶段 $i$ 结束时,$i$ 以后的数字怎么安排尚未考虑,$j$ 个要放在编号大于 $i$ 的盒子里的数字具体怎么放也没确定。

我们感兴趣的最终状态是 $(n, 0, K / 2)$ 。

注:上图中并未画出第 $n$ 条水平虚线 $\ell_n$,因为只有最终状态是 $(n, 0, \cdot)$ 才对应于一个排列,此时必有 $a_n = 0$。

以上图的放置过程为例,状态依次是
$(0, 0, 0) \to (1, 1, 1) \to (2, 2, 3) \to (3, 2, 5) \to (4, 1, 6) \to (5, 0, 6)$

状态转移

$(i, j, k) \to (i + 1, j', k')$

  1. 把 $i + 1$ 放进 $i + 1$ 号盒子:$(i + 1, j, k + j)$
  2. $j > 0$,把 $i + 1$ 放进 $x$ 号盒子($x \le i$):$(i + 1, j, k + j)$
  3. $j > 0$,把 $S$ 中的某个数放进 $i$ 号盒子:$(i + 1, j, k + j)$
  4. $j > 0$,把 $i + 1$ 放进 $x$ 号盒子($x \le i$)并把 $S$ 中的某个数放进 $i$ 号盒子:$(i + 1, j - 1, k + j - 1)$
  5. $S$ 中的数以及 $i+1$ 所在的盒子编号都大于 $i + 1$:$(i + 1, j + 1, k + j + 1)$

References

ABC134F Permutation Oddness的更多相关文章

  1. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

  2. Permutation Sequence

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  3. [LeetCode] Palindrome Permutation II 回文全排列之二

    Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...

  4. [LeetCode] Palindrome Permutation 回文全排列

    Given a string, determine if a permutation of the string could form a palindrome. For example," ...

  5. [LeetCode] Permutation Sequence 序列排序

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  6. [LeetCode] Next Permutation 下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  7. Leetcode 60. Permutation Sequence

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  8. UVA11525 Permutation[康托展开 树状数组求第k小值]

    UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...

  9. Permutation test: p, CI, CI of P 置换检验相关统计量的计算

    For research purpose, I've read a lot materials on permutation test issue. Here is a summary. Should ...

随机推荐

  1. 2018蓝桥杯C/C++组第4题第几个幸运数

    题目4标题:第几个幸运数 到x星球旅行的游客都被发给一个整数,作为游客编号.x星的国王有个怪癖,他只喜欢数字3,5和7.国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品. 我们来看前 ...

  2. zabbix企业微信告警配置教程

    前言: zabbix企业微信告警只需要配置一次就可以使用很久了,但是发现再次配置时,总会有遗忘,很麻烦又要去重新熟悉,所以,现在记录一份详细的配置过程,方便日后再次配置. 1.zabbix_serve ...

  3. P1914 小书童——密码

    输入格式: 第一行:n.第二行:未移动前的一串字母 输出格式: 一行,是此蒟蒻的密码 直接上代码: #include<iostream> using namespace std; int ...

  4. Android学习_7/26

    四种基本布局 1. 线性布局(LinearLayout) android:layout_gravity:指定控件在布局中的对齐方式 android:gravity:指定文字在控件中的对齐方式 andr ...

  5. 化学结构SDF文件

    参考博客 第一行:一般作为分子名字,如 Levetiracetam 第二行:注释,ChemDraw06111413562D 第三行:一般是空行 第四行:是原子个数 键的个数等的起始行. M END所在 ...

  6. Http请求优化

    Http请求优化 我们在做项目开发或多或少的都会使用SpringCloud,其中做远程调度的时候会将HTTP请求Http请求优化. HTTP请求Client存在很多种. JDK原生的URLConnec ...

  7. JS基础_使用工厂方法创建对象

    创建一个对象 var obj={ name:"hhh", age:28, gender:"男", say:function(){ console.log(&qu ...

  8. PHP 验证5-20位数字加字母的正则(数字和字母缺一不可)!!!

    $pattern = '/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{5,20}$/'; if(!preg_match($pattern,$username)){ re ...

  9. Java-类加载(类的生命周期)

    类从被加载到虚拟机内存开始,到卸载出内存为止. 解析阶段在某些情况下可以在初始化后再开始,这是为了支持 Java 语言的运行时绑定. 一.类加载时机 JVM 规范没有强制约束类加载过程的第一阶段(加载 ...

  10. Fiddler抓包原理和使用详解

    iddler抓包工具在APP开发过程中使用非常频繁,对开发者理解HTTP网络传输原理以及分析定位网络方面的问题非常有帮助.今天抽点时间出来总结一下Fiddler在实际开发过程中的应用. 我开发过程中使 ...