LeetCode in Kotlin

3867. Sum of GCD of Formed Pairs

Medium

You are given an integer array nums of length n.

Construct an array prefixGcd where for each index i:

After constructing prefixGcd:

Return an integer denoting the sum of the GCD values of all formed pairs.

The term gcd(a, b) denotes the greatest common divisor of a and b.

Example 1:

Input: nums = [2,6,4]

Output: 2

Explanation:

Construct prefixGcd:

i nums[i] mx<sub>i</sub> prefixGcd[i]
0 2 2 2
1 6 6 6
2 4 6 2

prefixGcd = [2, 6, 2]. After sorting, it forms [2, 2, 6].

Pair the smallest and largest elements: gcd(2, 6) = 2. The remaining middle element 2 is ignored. Thus, the sum is 2.

Example 2:

Input: nums = [3,6,2,8]

Output: 5

Explanation:

Construct prefixGcd:

i nums[i] mx<sub>i</sub> prefixGcd[i]
0 3 3 3
1 6 6 6
2 2 6 2
3 8 8 8

prefixGcd = [3, 6, 2, 8]. After sorting, it forms [2, 3, 6, 8].

Form pairs: gcd(2, 8) = 2 and gcd(3, 6) = 3. Thus, the sum is 2 + 3 = 5.

Constraints:

Solution

import kotlin.math.max

class Solution {
    fun gcdSum(nums: IntArray): Long {
        val prefixGcd = IntArray(nums.size)
        var max = -1
        for (i in nums.indices) {
            max = max(max, nums[i])
            prefixGcd[i] = gcd(max, nums[i])
        }
        prefixGcd.sort()
        var sum: Long = 0
        var i = 0
        var j = nums.size - 1
        while (i < j) {
            sum += gcd(prefixGcd[i], prefixGcd[j]).toLong()
            i++
            j--
        }
        return sum
    }

    private fun gcd(a: Int, b: Int): Int {
        var a = a
        var b = b
        while (b != 0) {
            val temp = b
            b = a % b
            a = temp
        }
        return a
    }
}