package LeetCode_1726 /** * 1726. Tuple with Same Product * https://leetcode.com/problems/tuple-with-same-product/ * Given an array nums of distinct positive integers, * return the number of tuples (a, b, c, d) such that a * b = c * d where a, b, c, and d are elements of nums, and a != b != c != d. Example 1: Input: nums = [2,3,4,6] Output: 8 Explanation: There are 8 valid tuples: (2,6,3,4) , (2,6,4,3) , (6,2,3,4) , (6,2,4,3) (3,4,2,6) , (4,3,2,6) , (3,4,6,2) , (4,3,6,2) Example 2: Input: nums = [1,2,4,5,10] Output: 16 Explanation: There are 16 valids tuples: (1,10,2,5) , (1,10,5,2) , (10,1,2,5) , (10,1,5,2) (2,5,1,10) , (2,5,10,1) , (5,2,1,10) , (5,2,10,1) (2,10,4,5) , (2,10,5,4) , (10,2,4,5) , (10,2,4,5) (4,5,2,10) , (4,5,10,2) , (5,4,2,10) , (5,4,10,2) Example 3: Input: nums = [2,3,4,6,8,12] Output: 40 Example 4: Input: nums = [2,3,5,7] Output: 0 Constraints: 1. 1 <= nums.length <= 1000 2. 1 <= nums[i] <= 10^4 3. All elements in nums are distinct. * */ class Solution { /* * solution: HashMap, accumulate the number of that every two number have a same product, * Time:O(n^2), Space:O(n) * */ fun tupleSameProduct(nums: IntArray): Int { val map = HashMap<Int, Int>() var count = 0 for (i in nums.indices) { for (j in i + 1 until nums.size) { val product = nums[i] * nums[j] val countOfProduct = map.getOrDefault(product, 0) //accumulate the count if have same product, for example [1,10,2,5]: 1*10 and 2*5 count += countOfProduct map.put(product, countOfProduct + 1) } } //each tuple [a,b,c,d] can be arranged in 8 different ways ot matching return 8 * count } }