Skip to main content
Back to problems
#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)
LeetCode
solution.rs
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
  }
}