ABC134F Permutation Oddness
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')$
- 把 $i + 1$ 放进 $i + 1$ 号盒子:$(i + 1, j, k + j)$
 - $j > 0$,把 $i + 1$ 放进 $x$ 号盒子($x \le i$):$(i + 1, j, k + j)$
 - $j > 0$,把 $S$ 中的某个数放进 $i$ 号盒子:$(i + 1, j, k + j)$
 - $j > 0$,把 $i + 1$ 放进 $x$ 号盒子($x \le i$)并把 $S$ 中的某个数放进 $i$ 号盒子:$(i + 1, j - 1, k + j - 1)$
 - $S$ 中的数以及 $i+1$ 所在的盒子编号都大于 $i + 1$:$(i + 1, j + 1, k + j + 1)$
 
References
ABC134F Permutation Oddness的更多相关文章
- AtCoder刷题记录
		
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
 - Permutation Sequence
		
The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
 - [LeetCode] Palindrome Permutation II 回文全排列之二
		
Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...
 - [LeetCode] Palindrome Permutation 回文全排列
		
Given a string, determine if a permutation of the string could form a palindrome. For example," ...
 - [LeetCode] Permutation Sequence 序列排序
		
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
 - [LeetCode] Next Permutation 下一个排列
		
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
 - 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 ...
 - UVA11525 Permutation[康托展开 树状数组求第k小值]
		
UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...
 - 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 ...
 
随机推荐
- Confluence 6 管理文件
			
文件是被附加到 Confluence 的页面上的.请参考 Upload Files 页面中的内容来了解如何附加文件到页面中. 一旦文件被附加到页面上了,你可以下载,删除和编辑这些文件.例如,你可以根据 ...
 - 使用Jmeter对观影券查询接口做性能测试
			
线程数:虚拟用户数.一个虚拟用户占用一个进程或线程.设置多少虚拟用户数在这里也就是设置多少个线程数. 准备时长: 设置的虚拟用户数需要多长时间全部启动.如果线程数为20 ,准备时长为10 ,那么需要1 ...
 - 邻居子系统 之 更新neigh_update
			
概述 neigh_update函数用来更新指定的邻居项,更新内容是硬件地址和状态,更新之后,会根据新状态设置其输出函数,CONNECTED状态则使用快速输出,否则使用慢速输出:如果是由原来的无效状态变 ...
 - web前端知识点反思总结
			
当别人问你之前的知识,我们便会勾起之前的回忆,然后进行一番痛苦的挣扎后,发现我依然记得你 什么是 DTD ? 文档类型定义 (DTD) 可定义合法的 xml 文档的构建模块 ,他是使用一系列合法的元素 ...
 - koa 项目实战(一)创建项目
			
1.安装模块 npm install koa koa-router --save npm install -g nodemon 2.入口文件 app.js const Koa = require('k ...
 - Mac 下 Android Studio 连 夜神模拟器 调试
			
1.运行夜神模拟器(自行搜索下载) 2.进入资源目录 cd /Applications/Nox\ App\ Player.app/Contents/MacOS 3.执行命令连接 adb connect ...
 - 解决 ElementTree 无法处理中文
			
解决 ElementTree 无法处理中文,UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 76-99: o ...
 - JAVA记事本的图形用户界面应用程序含加密
			
JAVA记事本的图形用户界面应用程序 加密 题目简介: 整体分析: 实验代码: import java.awt.EventQueue; import java.awt.event.ActionEven ...
 - http常见状态码分析
			
200:这个是最常见的http状态码,表示服务器已经成功接受请求,并将返回客户端所请求的最终结果 301:客户端请求的网页已经永久移动到新的位置,当链接发生变化时,返回301代码告诉客户端链接的变化, ...
 - LoadRunner 技巧之 思考时间设置
			
LoadRunner 技巧之 思考时间设置 用户访问某个网站或软件,一般不会不停地做个各种操作,例如一次查询,用户需要时间查看查询的结果是否是自己想要的.例如一次订单提交,用户需要时间核对自己填写的信 ...