Python程序:找到平方数等于两个数乘积的方案数

Python程序:找到平方数等于两个数乘积的方案数

假设我们有两个数组nums1和nums2,我们要找到满足以下两个规则的三元组(类型1和类型2)的数量 –

  • 三元组(i,j,k)如果nums1 [i] ^ 2 = nums2 [j] * nums2 [k],其中[0 <= i
  • 三元组(i,j,k)如果nums2 [i] ^ 2 = nums1 [j] * nums1 [k],其中[0 <= i

因此,如果输入是nums1 = [7,4] nums2 = [5,2,8,9],则输出将为1,因为有一种类型1的三元组(1,1,2),nums1 [1] ^ 2 = nums2 [1] * nums2 [2] = (16 = 2*8)。

要解决此问题,我们将遵循以下步骤:

  • cnt1:一个映射将nums1中的每个元素及其计数保存下来。
  • cnt2:一个映射将nums2中的每个元素及其计数保存下来。
  • 定义函数triplets(),该函数将接受arr1,arr2。
  • ans:初始值为0。
  • 对于arr1中的每个t,v的items(),
    • 如果arr2中存在t,k等于arr2 [t],否则k等于0。
    • tmp等于k*(k-1)/ 2。
    • sq等于t * t。
    • 对于arr2中的每个m,
      • 如果m<t,并且sq mod m等于0,则-
      • tmp:= tmp +(存在则为arr2 [m],否则为0)*(存在则为arr2 [sq / m的商],否则为0)。
  • ans = ans + tmp * v
  • 返回ans
  • 从主方法中执行以下操作-
  • 返回triplets(cnt1,cnt2)+ triplets(cnt2,cnt1)

示例

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

from collections import Counter
def solve(nums1, nums2):
   cnt1 = Counter(nums1)
   cnt2 = Counter(nums2)

   def triplets(arr1, arr2):
      ans = 0
      for t, v in arr1.items():
         k = arr2.get(t, 0)
         tmp = k * (k - 1) // 2
         sq = t * t
         for m in arr2:
            if m < t and sq % m == 0:
               tmp += arr2.get(m, 0) * arr2.get(sq // m, 0)
            ans += tmp * v
      return ans

   return triplets(cnt1, cnt2) + triplets(cnt2, cnt1)
nums1 = [7,4]
nums2 = [5,2,8,9]
print(solve(nums1, nums2))

输入

[7,4],[5,2,8,9]

输出

2

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程