Задать вопрос
@Irina_Yurievna
тестировщик с 3 летним опаттом

Почему в алгоритме нахождения числа перестановок ищется сумма по модулю 2?

Задача:
найти количество перестановок после ровно 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

Не улавливаю идею
  • Вопрос задан
  • 39 просмотров
Подписаться 1 Сложный Комментировать
Пригласить эксперта
Ответы на вопрос 1
наверное, из-за "соседних"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы