给你一个整数数组 nums
,请你返回该数组中恰有四个因数的这些整数的各因数之和。
如果数组中不存在满足题意的整数,则返回 0
。
输入:nums = [21,4,7]
输出:32
解释:
21 有 4 个因数:1, 3, 7, 21
4 有 3 个因数:1, 2, 4
7 有 2 个因数:1, 7
答案仅为 21 的所有因数的和。
class Solution {
public int sumFourDivisors(int[] nums) {
int max = nums[0], sum = 0;
for (int i = 0; i < nums.length; i++) if (max < nums[i]) max = nums[i];
List<Integer> list = primes(max / 2 + 1);
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < list.size(); i++) {
if (Math.pow(list.get(i), 3) <= max) map.put((int) Math.pow(list.get(i), 3), (int) (1 + Math.pow(list.get(i), 1) + Math.pow(list.get(i), 2) + Math.pow(list.get(i), 3)));
for (int j = i + 1; j < list.size(); j++) {
if (list.get(i) > max / list.get(j)) break;
map.put(list.get(i) * list.get(j), (1 + list.get(i) * list.get(j) + list.get(i) + list.get(j)));
}
if (Math.pow(list.get(i), 3) < max) map.put((int) Math.pow(list.get(i), 3), (int) (1 + Math.pow(list.get(i), 1) + Math.pow(list.get(i), 2) + Math.pow(list.get(i), 3)));
}
for (int i = 0; i < nums.length; i++) if (map.containsKey(nums[i])) sum += map.get(nums[i]);
return sum;
}
private List<Integer> primes(int n) {
List<Integer> primes = new ArrayList<>();
Boolean[] isPrim = new Boolean[n];
Arrays.fill(isPrim, true);
for (int i = 2; i < n; i++) if (isPrim[i]) for (int j = 2 * i; j < n; j += i) isPrim[j] = false;
for (int i = 2; i < isPrim.length; i++) if (isPrim[i]) primes.add(i);
return primes;
}
}