#2198
Medium Algorithms Number of single divisor triplets
Array Counting Enumeration
54.7% acceptance
Mar 31, 2026
28
12
No description available.
Solution
Rust
Time O(n³)
Space O(1)
impl Solution {
pub fn single_divisor_triplet(nums: Vec<i32>) -> i64 {
// nums[i] <= 100, so count frequencies
let mut freq = [0i64; 101];
for &x in &nums {
freq[x as usize] += 1;
}
let mut ans: i64 = 0;
// Iterate over all value triplets (a, b, c) where a <= b <= c
for a in 1..=100i32 {
if freq[a as usize] == 0 { continue; }
for b in a..=100i32 {
if freq[b as usize] == 0 { continue; }
for c in b..=100i32 {
if freq[c as usize] == 0 { continue; }
let s = (a + b + c) as i64;
let div_a = if s % a as i64 == 0 { 1 } else { 0 };
let div_b = if s % b as i64 == 0 { 1 } else { 0 };
let div_c = if s % c as i64 == 0 { 1 } else { 0 };
if div_a + div_b + div_c != 1 {
continue;
}
let fa = freq[a as usize];
let fb = freq[b as usize];
let fc = freq[c as usize];
// Count unordered combinations, then multiply by permutations
let combos: i64;
let perms: i64;
if a == b && b == c {
combos = fa * (fa - 1) * (fa - 2) / 6;
} else if a == b {
combos = fa * (fa - 1) / 2 * fc;
} else if b == c {
combos = fa * fb * (fb - 1) / 2;
} else {
combos = fa * fb * fc;
}
perms = 6;
ans += combos * perms;
}
}
}
ans
}
}