ให้ Array nums หา **ผลรวมของตัวหารทั้งหมด** ของจำนวนใน Array ที่มี **ตัวหารทั้งหมด 4 ตัว** (พอดี) ถ้าไม่มีจำนวนไหน -> Return 0
ตัวอย่าง
nums = [21, 4, 7]
- 21: ตัวหาร {1, 3, 7, 21} -> **4 ตัว** -> Sum = 32
- 4: ตัวหาร {1, 2, 4} -> 3 ตัว
- 7: ตัวหาร {1, 7} -> 2 ตัว
Output: 32 (Sum ของตัวหาร 21 เท่านั้น)
แนวทาง: Factorization + Counting Divisors
สำหรับแต่ละ x ใน Array:
- Initialize
sum = 1 + x,count = 2(1 และ x เอง) - Loop
i = 2 .. sqrt(x):- ถ้า
x % i == 0:sum += i,count++- ถ้า
i != x/i->sum += x/i,count++
- ถ้า
- ถ้า
count == 4-> Returnsum, Else Return 0
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int sumOfDivisorsIfFour(int x) {
int sum = 1 + x;
int cnt = 2;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) {
sum += i;
cnt++;
if (i != x / i) {
sum += x / i;
cnt++;
}
}
}
return (cnt == 4) ? sum : 0;
}
int sumFourDivisors(vector<int>& nums) {
int ret = 0;
for (int x : nums) ret += sumOfDivisorsIfFour(x);
return ret;
}
};
Input / Output
Input: [21,4,7] Output: 32
ความซับซ้อน (Complexity)
- Time: O(N * √M) — N = |nums|, M = max(nums[i]) (Factorization ต่อจำนวน)
- Space: O(1)
Optimization (ถ้า M ใหญ่และ N ใหญ่)
Precompute Smallest Prime Factor (SPF) ด้วย Sieve จน √M หรือ M -> Factorize แต่ละตัวได้ O(log M) แทน O(√M) แต่สำหรับ Constraints ปกติ (M ≤ 10⁵) วิธี √M พอครับ