Syntax error Program to find number of elements in all permutation which are following given conditions in Python

Program to find number of elements in all permutation which are following given conditions in Python



Suppose we have a set A where all elements from 1 to n are present. And P(A) represents all permutations of elements present in A. We have to find number of elements in P(A) which satisfies the given conditions

  • For all i in range [1, n], A[i] is not same as i
  • There exists a set of k indices {i1, i2, ... ik} such that A[ij] = ij+1 for all j < k and A[ik] = i1 (cyclic).

So, if the input is like n = 3 k = 2, then the output will be 0 because -

Consider the Array's are 1 indexed. As N = 3 and K = 2, we can find 2 sets of A that satisfy the first property a[i] ≠ i, they are [3,1,2] and [2,3,1]. Now as K = 2, we can have 6 such elements.

[1,2], [1,3],[2,3], [2,1], [3,1], [3,2]. Now if we consider the first element of

P(A) -> [3,1,2]

  • [1,2], A[1] ≠ 2
  • [1,3], A[1] = 3 but A[3] ≠ 1
  • [2,3], A[2] ≠ 3
  • [2,1], A[2] = 1 but A[1] ≠ 2
  • [3,1], A[3] = 1 but A[1] ≠ 3
  • [3,2], A[3] ≠ 2

P(A) -> [2,3,1]

  • [1,2], A[1] = 2 but A[2] ≠ 1
  • [1,3], A[1] ≠ 3
  • [2,3], A[2] = 3 but A[3] ≠ 3
  • [2,1], A[2] ≠ 1
  • [3,1], A[3] = but A[1] ≠ 3
  • [3,2], A[3] ≠ 2

As none of the elements of a satisfy the properties above, hence 0.

To solve this, we will follow these steps −

  • ps := all permutations of arrays with elements in range [1, n]
  • c := 0
  • for each p in ps, do
    • for each index i and value a in p, do
      • if a is same as i, then
        • come out from the loop
    • otherwise,
      • for j in range 0 to n - 1, do
        • current := p[j]
        • cycle_length := 1
        • while current is not same as j, do
          • current := p[current]
          • cycle_length := cycle_length + 1
        • if cycle_length is same as k, then
          • c := c + 1
          • come out from the loop
  • return c

Example

Let us see the following implementation to get better understanding −

import itertools

def solve(n, k):
   ps = itertools.permutations(range(n), n)
   c = 0
   for p in ps:
      for i, a in enumerate(p):
         if a == i:
            break
      else:
         for j in range(n):
            current = p[j]
            cycle_length = 1
            while current != j:
               current = p[current]
               cycle_length += 1
            if cycle_length == k:
               c += 1
               break
   return c

n = 3
k = 2
print(solve(n, k))

Input

3, 2

Output

0
Updated on: 2021-10-25T06:56:32+05:30

295 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements