Welcome to Subscribe On Youtube

1390. Four Divisors

Description

Given an integer array nums, return the sum of divisors of the integers in that array that have exactly four divisors. If there is no such integer in the array, return 0.

 

Example 1:

Input: nums = [21,4,7]
Output: 32
Explanation: 
21 has 4 divisors: 1, 3, 7, 21
4 has 3 divisors: 1, 2, 4
7 has 2 divisors: 1, 7
The answer is the sum of divisors of 21 only.

Example 2:

Input: nums = [21,21]
Output: 64

Example 3:

Input: nums = [1,2,3,4,5]
Output: 0

 

Constraints:

  • 1 <= nums.length <= 104
  • 1 <= nums[i] <= 105

Solutions

Solution 1: Factor Decomposition

We can perform factor decomposition on each number. If the number of factors is $4$, then this number meets the requirements of the problem, and we can add its factors to the answer.

The time complexity is $O(n \times \sqrt{n})$, where $n$ is the length of the array. The space complexity is $O(1)$.

  • class Solution {
        public int sumFourDivisors(int[] nums) {
            int ans = 0;
            for (int x : nums) {
                ans += f(x);
            }
            return ans;
        }
    
        private int f(int x) {
            int cnt = 2, s = x + 1;
            for (int i = 2; i <= x / i; ++i) {
                if (x % i == 0) {
                    ++cnt;
                    s += i;
                    if (i * i != x) {
                        ++cnt;
                        s += x / i;
                    }
                }
            }
            return cnt == 4 ? s : 0;
        }
    }
    
  • class Solution {
    public:
        int sumFourDivisors(vector<int>& nums) {
            int ans = 0;
            for (int x : nums) {
                ans += f(x);
            }
            return ans;
        }
    
        int f(int x) {
            int cnt = 2, s = x + 1;
            for (int i = 2; i <= x / i; ++i) {
                if (x % i == 0) {
                    ++cnt;
                    s += i;
                    if (i * i != x) {
                        ++cnt;
                        s += x / i;
                    }
                }
            }
            return cnt == 4 ? s : 0;
        }
    };
    
  • class Solution:
        def sumFourDivisors(self, nums: List[int]) -> int:
            def f(x: int) -> int:
                i = 2
                cnt, s = 2, x + 1
                while i <= x // i:
                    if x % i == 0:
                        cnt += 1
                        s += i
                        if i * i != x:
                            cnt += 1
                            s += x // i
                    i += 1
                return s if cnt == 4 else 0
    
            return sum(f(x) for x in nums)
    
    
  • func sumFourDivisors(nums []int) (ans int) {
    	f := func(x int) int {
    		cnt, s := 2, x+1
    		for i := 2; i <= x/i; i++ {
    			if x%i == 0 {
    				cnt++
    				s += i
    				if i*i != x {
    					cnt++
    					s += x / i
    				}
    			}
    		}
    		if cnt == 4 {
    			return s
    		}
    		return 0
    	}
    	for _, x := range nums {
    		ans += f(x)
    	}
    	return
    }
    
  • function sumFourDivisors(nums: number[]): number {
        const f = (x: number): number => {
            let cnt = 2;
            let s = x + 1;
            for (let i = 2; i * i <= x; ++i) {
                if (x % i === 0) {
                    ++cnt;
                    s += i;
                    if (i * i !== x) {
                        ++cnt;
                        s += Math.floor(x / i);
                    }
                }
            }
            return cnt === 4 ? s : 0;
        };
        let ans = 0;
        for (const x of nums) {
            ans += f(x);
        }
        return ans;
    }
    
    

All Problems

All Solutions