在 Python 中查找符合给定条件的所有排列中的元素数量的程序
假设我们有一个集合A,其中从1到n的所有元素都存在。并P(A)表示A中存在的元素的所有排列。我们必须找到P(A)满足给定条件的元素数量
对于[1,n]范围内的所有i,A[i]与i不同
存在一组k个索引{i1,i2,...ik}使得A[ij]=ij+1对于所有j<k和A[ik]=i1(循环)。
因此,如果输入类似于n=3k=2,那么输出将为0,因为-
考虑数组的索引为1。由于N=3和K=2,我们可以找到满足第一个属性a[i]≠i的2组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。
示例
让我们看看以下实现以获得更好的理解-
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