Задача:
найти количество перестановок после ровно k количества прилегающих перестановок
https://www.hackerrank.com/challenges/swappermutat...
https://www.tutorialspoint.com/program-to-find-num...
Алгоритм:
M = 10**9+7
A = [1]
for n in range(2,n+1):
B = A.copy()
A = [1]
limit=min(k+1, n*(n-1)//2+1)
print(f"limit {limit}")
for x in range(1, limit):
print(f"x {x}, B, {B}, A {A}")
A.append((A[-1] + (B[x] if x<len(B) else 0) - (B[x-n] if 0<=x-n else 0)) % M )
print(f"normalA {A} cut {A[k%2:k+1:2]}")
return sum(A[k%2:k+1:2]) % M,C[min(n-1,k)]
Дебаг:
limit 3
x 1, B, [1, 1], A [1]
x 2, B, [1, 1], A [1, 2]
normalA [1, 2, 2] cut [1, 2]
Ответ: 3
Обьясненеие:
[1, 2, 3] k=2 ==> [1, 2, 3], [2, 3, 1], [3, 1, 2] ==> 3
Другой код
def swapPermutation(n, k):
s = [1] + [0] * k
t = [1] + [0] * k
for i in range(1, n):
ss = sum(s[max(k-i, 0):k]) % p
for j in range(k, 0, -1):
s[j] = (s[j] + ss) % p
if j > i:
ss = (ss + s[j - i - 1] - s[j-1]) % p
else:
ss = (ss - s[j-1]) % p
for j in range(k, 0, -1):
t[j] = (t[j] + i * t[j-1]) % p
return sum(s[k%2::2]) % p, sum(t) % p
Не улавливаю идею