# FANNKUCH benchmark
from math import factorial as fact
from sys import argv
from time import time

def perm(n, i):
    p = [0] * n

    for k in range(n):
        f = fact(n - 1 - k)
        p[k] = i // f
        i = i % f

    for k in range(n - 1, -1, -1):
        for j in range(k - 1, -1, -1):
            if p[j] <= p[k]:
                p[k] += 1

    return p

n = int(argv[1])
max_flips = 0

t0 = time()
@par(schedule='dynamic', num_threads=4)
for idx in range(fact(n)):
    p = perm(n, idx)
    flips = 0
    k = p[0]

    while k:
        i = 0
        j = k
        while i < j:
            p[i], p[j] = p[j], p[i]
            i += 1
            j -= 1

        k = p[0]
        flips += 1

    max_flips = max(flips, max_flips)

print(f'Pfannkuchen({n}) = {max_flips}')
t1 = time()
print(t1 - t0)
