#abc468c. Between P and Q

    ID: 4370 Type: Default 1000ms 256MiB Tried: 0 Accepted: 0 Difficulty: 3 Uploaded By: Tags>普及/提高-康托展开排列组合数学

Between P and Q

题目描述

给定整数 NN,以及两个 (1,2,…,N)(1, 2, \ldots, N) 的排列 P=(P1,P2,…,PN)P = (P_1, P_2, \ldots, P_N) 和 Q=(Q1,Q2,…,QN)Q = (Q_1, Q_2, \ldots, Q_N)。

请求出有多少个 (1,2,…,N)(1, 2, \ldots, N) 的排列,按字典序严格大于 PP 且严格小于 QQ。

什么是字典序?

对两个整数序列 SS 和 TT,称 SS 字典序小于 TT,当且仅当下面两条之一成立:

  1. ∣S∣<∣T∣|S| < |T| 且 SS 是 TT 的前缀,即 (S1,…,S∣S∣)=(T1,…,T∣S∣)(S_1, \ldots, S_{|S|}) = (T_1, \ldots, T_{|S|});
  2. 存在整数 1≤i≤min⁡(∣S∣,∣T∣)1 \le i \le \min(|S|, |T|),使得 (S1,…,Si−1)=(T1,…,Ti−1)(S_1, \ldots, S_{i-1}) = (T_1, \ldots, T_{i-1}) 且 Si<TiS_i < T_i。

通俗地说,就是像查字典一样,从左往右逐位比较,第一个不同的位置谁小谁就小。

输入格式

N
P_1 P_2 ... P_N
Q_1 Q_2 ... Q_N

输出格式

输出满足条件的排列个数。

输入示例 1

3
1 3 2
3 1 2

输出示例 1

2

示例 1 说明

N=3N = 3 的全部 66 个排列按字典序排列为:

$$(1,2,3) < (1,3,2) < (2,1,3) < (2,3,1) < (3,1,2) < (3,2,1)$$

严格夹在 P=(1,3,2)P = (1,3,2) 与 Q=(3,1,2)Q = (3,1,2) 之间的是 (2,1,3)(2,1,3) 和 (2,3,1)(2,3,1),共 22 个。

输入示例 2

5
5 4 2 1 3
5 1 2 3 4

输出示例 2

0

示例 2 说明

这里 QQ 的字典序其实比 PP 还小(第 22 位 1<41 < 4),所以不存在夹在中间的排列,输出 00。注意题目并没有保证 P<QP < Q。

输入示例 3

7
3 6 5 2 7 1 4
4 1 5 7 2 3 6

输出示例 3

223

示例 3 说明

N=7N = 7 时全部排列共 7!=50407! = 5040 个。P=(3,6,5,2,7,1,4)P = (3,6,5,2,7,1,4) 的字典序排名与 Q=(4,1,5,7,2,3,6)Q = (4,1,5,7,2,3,6) 的排名相差 224224,减去 PP 自己这一个,得到夹在中间的有 223223 个。

这组数据说明:NN 稍大时答案会迅速变大,必须用排名相减而不是逐个枚举比较。

约束条件

  • 1≤N≤101 \le N \le 10
  • PP、QQ 都是 (1,2,…,N)(1, 2, \ldots, N) 的排列
  • 所有输入值均为整数