use crate::Solution;
use itertools::Itertools;
use pmath::gcd;
problem!(Problem0039, 39, "Integer Right Triangles");
impl Solution for Problem0039 {
fn solve(&self) -> String {
const MAX_P: u64 = 1000;
let mut solutions = vec![0; MAX_P as usize + 1];
let m_lower_bound = 2;
let m_upper_bound = (MAX_P as f64 / 2.0).sqrt().floor() as u64;
for m in m_lower_bound..=m_upper_bound {
for n in 1..m {
if gcd(m, n) == 1 && (m - n) % 2 == 1 {
let p = 2 * m * (m + n);
if p > MAX_P {
break;
}
let mut k = p;
while k <= MAX_P {
solutions[k as usize] += 1;
k += p;
}
}
}
}
solutions.iter().position_max().unwrap().to_string()
}
}