ABC150 C問題 itertoolsで楽々と順列問題を解く

また順列を使う問題を解きました。
大きさNの順列 (1, 2, ... , N)があって、その順列を並び替えてできる列をP、Qとします。
大きさNの順列を並び替えると全部で N!パターンあって、Pが辞書順でa番目、Qが辞書順でb番目だとしたときに |a-b|を求める問題。

atcoder.jp

例えば、大きさ3の順列のパターンは全部で
 (1,2,3)、(1, 3, 2)、(2, 1, 3)、(2, 3, 1)、(3, 1, 2)、(3, 2, 1) の6通りあります。
このうち (1, 3, 2)は辞書順で 2番目、(3, 1, 2)は辞書順で 5番目なので、答えは |2-5| = 3になります。

まずNは最大で8なので、 8*7*6*5*4*3*2 = 40320通りなので、良心的だなと思いながら、itertools.permutationsを使って、全通りのパターンの配列を作成します。
全パターンの配列を全探索してPとQのインデックスを記録します。

from itertools import permutations
N = int(input())
lst = [i for i in range(1, N + 1)]
P = tuple(int(i) for i in input().split())
Q = tuple(int(i) for i in input().split())
all_lst = list(permutations(lst))
p_idx = 0
q_idx = 0
for i, e in enumerate(all_lst):
    if e == P:
        p_idx = i
    if e == Q:
        q_idx = i
print(abs(p_idx - q_idx))

itertools.permutations、ありがとう。