use std::collections::HashMap; const INF: usize = 1usize << 60; fn main() { let mut nmp = String::new(); std::io::stdin().read_line(&mut nmp).ok(); let nmp: Vec = nmp.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); let n = nmp[0]; let m = nmp[1]; let p = nmp[2]; let mut a = String::new(); std::io::stdin().read_line(&mut a).ok(); let a: Vec = a.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); let maxval = *a.iter().max().unwrap(); if maxval > m { println!("1"); return; } let val2cnt = a.into_iter().map(|v| { let mut cnt = 1usize; let mut val = v; while val % p == 0 { val /= p; cnt += 1; } (val, cnt) }) .collect::>(); let val2cnt = val2cnt.into_iter().filter(|&(v, _)| v > 1).collect::>(); if val2cnt.is_empty() { println!("-1"); return; } let mut dp = vec![1usize; 100]; dp[1] = maxval; for &(val, cnt) in val2cnt.iter() { let mut next_dp = vec![1usize; 100]; for i in 0..100 { next_dp[i] = next_dp[i].max(dp[i]); if i >= cnt && next_dp[i-cnt] < INF { next_dp[i] = next_dp[i].max(next_dp[i-cnt] * val); if next_dp[i] > m { next_dp[i] = INF; } } } dp = next_dp; } println!("{}", dp.iter().enumerate().filter(|&(_, &v)| v == INF).nth(0).unwrap().0); }