📌  相关文章
📜  具有 GCD K 的给定数组中的三元组计数(1)

📅  最后修改于: 2023-12-03 15:22:34.605000             🧑  作者: Mango

题目描述

给定一个整数数组和一个整数K,请编写一个函数来计算该数组中有多少个三元组(三个不同的数字),使它们的最大公约数为K

例如,对于数组[2, 3, 4, 6, 9, 12] K=3,结果为3,因为存在三个三元组(2,3,9)(3,6,9)(3,9,12)的最大公约数均为3

方法

我们可以首先统计原数组中每个数出现的次数(由于数字可以重复出现,因此必须统计频率),然后找出可行的三元组。假设当前考虑的三元组为(a,b,c),我们需要满足以下条件:

  1. $a,b,c$ 两两不同。
  2. $\gcd(a,b) = \gcd(b,c) = \gcd(a,c) = x$,其中 $x$ 是给定的 $K$。

当然,三元组的顺序并不重要,因此我们可以假设 $a\le b\le c$,并只考虑满足 $a\le b\le c$ 的三元组。此时我们需要用到双重循环:第一重循环枚举 $a$,第二重循环枚举 $b$ 和 $c$。对于第二重循环,我们实际上只需要枚举 $b$,然后令 $c \ge b$;同时为了避免重复,我们在从数组的末尾往前遍历 $b$ 和 $c$ 时,要保证 $b<c$。

代码实现

代码实现的时候,我们可以先使用 Counter 统计字符频率。然后枚举每个可能的 $(a,b,c)$,调用 math.gcd 函数计算 $\gcd$ 值。时间复杂度为$ O(n^2)$。