use std::collections::HashSet; fn get_primes(n: usize) -> Vec { let mut flgs = vec![true; n+1]; flgs[0] = false; flgs[1] = false; let limit = (n as f64).sqrt().ceil() as usize; for i in 2..=limit { if !flgs[i] { continue; } for j in i..=n/i { flgs[i*j] = false; } } flgs } fn main() { let mut np = String::new(); std::io::stdin().read_line(&mut np).ok(); let np: Vec = np.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); let n = np[0]; let p = np[1]; let primes = get_primes(n); let mut used_primes: HashSet = HashSet::new(); if primes[p] { used_primes.insert(p); } else { let mut temp = p; for i in 2..p { if !primes[i] { continue; } while temp % i == 0 { temp /= i; used_primes.insert(i); } } } for i in 2..=n/p { if primes[i] { used_primes.insert(i); } } let limit: usize = if p == 9 { 0 } else { n / used_primes.iter().min().unwrap() }; let mut result: Vec = vec![false; n+1]; for i in 2..=n { if primes[i] && i <= limit { used_primes.insert(i); } if primes[i] && used_primes.contains(&i) { for j in 1..=n/i { result[i*j] = true; if primes[j] { used_primes.insert(j); } } } } println!("{}", result.iter().filter(|&f| *f).count()); }