用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
- 从循环中退出
- 对于p中的每个索引i和值a,执行以下操作
- 返回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