用Python编写程序,找出满足给定条件的所有排列中元素的数量

用Python编写程序,找出满足给定条件的所有排列中元素的数量

假设我们有一个集合A,其中包含从1到n的所有元素。 P(A)表示A中存在的元素的所有排列。我们必须找到满足给定条件的P(A)中元素的数量。

  • 对于所有i在范围[1,n]内,A [i]不同于i
  • 存在一组k索引{i1,i2,… ik},使得对于所有j<k和A [ik] = i1(环形)的情况下都有A [ij] = ij + 1。

因此,如果输入如n = 3 k = 2,则输出将为0,因为-

将数组视为1索引。由于N = 3且K = 2,因此我们可以找到2个满足第一个条件a [i]≠i的A集合,它们是[3,1,2]和[2,3,1]。现在,由于K = 2,我们可以有6个这样的因素。

[1,2],[1,3],[2,3],[2,1],[3,1],[3,2]。现在,如果我们考虑

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

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

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

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

由于a的任何元素都不满足上述属性,因此为0。

为解决此问题,我们将按以下步骤进行处理:

  • ps:具有范围[1,n]中元素的数组的所有排列
  • c:0
  • 对于ps中的每个p,执行以下操作
    • 对于p中的每个索引i和值a,执行以下操作
      • 如果a与i相同,则
      • 从循环中退出
    • 否则,
      • 对于j在范围0到n-1内,执行以下操作
      • current:= p [j]
      • cycle_length:= 1
      • while current不与j相同,执行以下操作
        • current:= p [current]
        • cycle_length:= cycle_length + 1
      • 如果cycle_length与k相同,则
        • c:= c + 1
        • 从循环中退出
  • 返回c

让我们看一下以下实现以更好地了解-

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))

输入

3, 2

输出

0

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程