Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

파이썬에서 숫자의 제곱이 두 숫자의 곱과 같은 방법의 수를 찾는 프로그램

<시간/>

두 개의 배열 nums1과 nums2가 있다고 가정하고 이 두 가지 규칙에 따라 형성된 삼중항(유형 1 및 유형 2)을 찾아야 합니다. -

  • 3중항(i, j, k) if nums1[i]^2 =nums2[j] * nums2[k] 여기서 [0 <=i
  • 3중항(i, j, k) if nums2[i]^2 =nums1[j] * nums1[k] 여기서 [0 <=i

따라서 입력이 nums1 =[7,4] nums2 =[5,2,8,9]와 같으면 유형 1, (1,1,2), nums1의 삼중항이 있기 때문에 출력은 1이 됩니다. [1]^2 =숫자2[1] * 숫자2[2] =(16 =2*8).

이 문제를 해결하기 위해 다음 단계를 따릅니다.

  • cnt1 :=각 요소와 nums1의 개수를 담는 맵
  • cnt2 :=각 요소와 nums2의 개수를 담는 맵
  • triplets() 함수를 정의합니다. arr1, ar2가 걸립니다.
  • ans :=0
  • arr1의 항목()에 있는 각 t, v에 대해
    • k :=arr2[t] 있으면 0
    • tmp :=k*(k - 1) / 2
    • 제곱:=t * t
    • arr2의 각 m에 대해
      • m
      • tmp :=tmp + (arr2[m] 있으면 0) * (arr2[제곱/m의 몫] 있으면 0)
  • ans :=ans + tmp * v
  • 반환
  • 메인 방법에서 다음을 수행하십시오-
  • 삼중항(cnt1, cnt2) + 삼중항(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