use std::collections::HashMap; const MOD: usize = 1e9 as usize + 7; fn gcd(a: usize, b: usize) -> usize { if b == 0 { return a; } gcd(b, a%b) } fn main() { let mut nk = String::new(); std::io::stdin().read_line(&mut nk).ok(); let nk: Vec = nk.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); let n = nk[0]; let k = nk[1]; 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 mut dp = HashMap::new(); dp.insert(1usize, 1usize); for i in 0..n { let mut next_dp = HashMap::new(); for (&val, &cnt) in dp.iter() { let gcdval = gcd(a[i], k); let gcdval = gcd(gcdval*val, k); *next_dp.entry(val).or_insert(0usize) += cnt; *next_dp.entry(val).or_insert(0usize) %= MOD; *next_dp.entry(gcdval).or_insert(0usize) += cnt; *next_dp.entry(gcdval).or_insert(0usize) %= MOD; } dp = next_dp; } let result = MOD + *dp.get(&k).unwrap_or(&0usize) - if k == 1 { 1 } else { 0 }; println!("{}", result % MOD); }