You are given a 1**-indexed** array nums. Your task is to select a
complete subset from nums where every pair of selected indices multiplied is a perfect square,. i. e. if you select ai and aj, i * j
must be a perfect square.
Return the sum of the complete subset with the maximum sum.
For indices i and j, i * j is a perfect square if and only if their square-free parts are equal. So, group indices by their square-free part and sum the maximum group.
classSolution {
public:int maxSum(vector<int>& nums) {
int n = nums.size();
unordered_map<int, int> group;
for (int i =1; i <= n; ++i) {
int x = i, sqf =1;
for (int d =2; d * d <= x; ++d) {
int cnt =0;
while (x % d ==0) x /= d, cnt++;
if (cnt %2) sqf *= d;
}
if (x >1) sqf *= x;
group[sqf] += nums[i-1];
}
int ans =0;
for (auto& [_, s] : group) ans = max(ans, s);
return ans;
}
};
classSolution {
publicintmaximumSum(int[] nums) {
int n = nums.length;
Map<Integer, Integer> group =new HashMap<>();
for (int i = 1; i <= n; i++) {
int x = i, sqf = 1;
for (int d = 2; d * d <= x; d++) {
int cnt = 0;
while (x % d == 0) {
x /= d;
cnt++;
}
if (cnt % 2 == 1) sqf *= d;
}
if (x > 1) sqf *= x;
group.put(sqf, group.getOrDefault(sqf, 0) + nums[i-1]);
}
int ans = 0;
for (int s : group.values()) ans = Math.max(ans, s);
return ans;
}
}
classSolution {
funmaximumSum(nums: IntArray): Int {
val n = nums.size
val group = mutableMapOf<Int, Int>()
for (i in1..n) {
var x = i
var sqf = 1var d = 2while (d * d <= x) {
var cnt = 0while (x % d ==0) {
x /= d
cnt++ }
if (cnt % 2==1) sqf *= d
d++ }
if (x > 1) sqf *= x
group[sqf] = group.getOrDefault(sqf, 0) + nums[i-1]
}
return group.values.maxOrNull() ?:0 }
}
classSolution:
defmaximumSum(self, nums: list[int]) -> int:
from collections import defaultdict
defsquare_free(x: int) -> int:
d, sqf =2, 1while d * d <= x:
cnt =0while x % d ==0:
x //= d
cnt +=1if cnt %2:
sqf *= d
d +=1if x >1:
sqf *= x
return sqf
group = defaultdict(int)
for i in range(1, len(nums)+1):
group[square_free(i)] += nums[i-1]
return max(group.values())
impl Solution {
pubfnmaximum_sum(nums: Vec<i32>) -> i32 {
use std::collections::HashMap;
fnsquare_free(mut x: usize) -> usize {
letmut sqf =1;
letmut d =2;
while d * d <= x {
letmut cnt =0;
while x % d ==0 {
x /= d;
cnt +=1;
}
if cnt %2==1 {
sqf *= d;
}
d +=1;
}
if x >1 {
sqf *= x;
}
sqf
}
letmut group = HashMap::new();
for (i, &v) in nums.iter().enumerate() {
let sqf = square_free(i+1);
*group.entry(sqf).or_insert(0) += v;
}
*group.values().max().unwrap()
}
}