use std::collections::HashSet;
macro_rules! input {
(from $iter:expr, $($r:tt)*) => {
input_inner!{$iter, $($r)*}
};
(source = $s:expr, $($r:tt)*) => {
let mut iter = $s.split_whitespace();
input_inner!{iter, $($r)*}
};
($($r:tt)*) => {
let s = {
use std::io::Read;
let mut s = String::new();
std::io::stdin().read_to_string(&mut s).unwrap();
s
};
let mut iter = s.split_whitespace();
input_inner!{iter, $($r)*}
};
}
macro_rules! input_inner {
($iter:expr) => {};
($iter:expr, ) => {};
($iter:expr, $var:ident : $t:tt $($r:tt)*) => {
let $var = read_value!($iter, $t);
input_inner!{$iter $($r)*}
};
}
macro_rules! read_value {
($iter:expr, ( $($t:tt),* )) => {
( $(read_value!($iter, $t)),* )
};
($iter:expr, [ $t:tt ; $len:expr ]) => {
(0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()
};
($iter:expr, chars) => {
read_value!($iter, String).chars().collect::<Vec<char>>()
};
($iter:expr, usize1) => {
read_value!($iter, usize) - 1
};
($iter:expr, $t:ty) => {
$iter.next().unwrap().parse::<$t>().expect("Parse error")
};
}
fn get_primes(n: usize) -> Vec<usize> {
let mut primes = Vec::new();
let mut is_prime = vec![true; n + 1];
for i in 2..=n {
if is_prime[i] {
primes.push(i);
for j in (i * i..=n).step_by(i) {
is_prime[j] = false;
}
}
}
primes
}
fn count_for_k(stones: &HashSet<usize>, k: usize) -> usize {
let mut reminders = vec![0; k];
for stone in stones {
reminders[stone % k] += 1;
}
reminders.iter().max().copied().unwrap_or(0)
}
fn main() {
input! {
n: usize,
q: usize,
a: [usize; q],
}
let primes = get_primes(n);
let mut stones = HashSet::new();
for a in a {
if !stones.remove(&a) {
stones.insert(a);
}
if stones.len() < 3 {
println!("{}", stones.len());
continue;
}
let limit = 2 * n / stones.len() + 1;
let results = primes
.iter()
.take_while(|&&p| p <= limit)
.map(|&p| count_for_k(&stones, p))
.collect::<Vec<_>>();
// eprintln!("{:?}", results);
println!("{}", results.iter().max().unwrap());
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | use std::collections::HashSet; macro_rules! input { (from $iter:expr, $($r:tt)*) => { input_inner!{$iter, $($r)*} }; (source = $s:expr, $($r:tt)*) => { let mut iter = $s.split_whitespace(); input_inner!{iter, $($r)*} }; ($($r:tt)*) => { let s = { use std::io::Read; let mut s = String::new(); std::io::stdin().read_to_string(&mut s).unwrap(); s }; let mut iter = s.split_whitespace(); input_inner!{iter, $($r)*} }; } macro_rules! input_inner { ($iter:expr) => {}; ($iter:expr, ) => {}; ($iter:expr, $var:ident : $t:tt $($r:tt)*) => { let $var = read_value!($iter, $t); input_inner!{$iter $($r)*} }; } macro_rules! read_value { ($iter:expr, ( $($t:tt),* )) => { ( $(read_value!($iter, $t)),* ) }; ($iter:expr, [ $t:tt ; $len:expr ]) => { (0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>() }; ($iter:expr, chars) => { read_value!($iter, String).chars().collect::<Vec<char>>() }; ($iter:expr, usize1) => { read_value!($iter, usize) - 1 }; ($iter:expr, $t:ty) => { $iter.next().unwrap().parse::<$t>().expect("Parse error") }; } fn get_primes(n: usize) -> Vec<usize> { let mut primes = Vec::new(); let mut is_prime = vec![true; n + 1]; for i in 2..=n { if is_prime[i] { primes.push(i); for j in (i * i..=n).step_by(i) { is_prime[j] = false; } } } primes } fn count_for_k(stones: &HashSet<usize>, k: usize) -> usize { let mut reminders = vec![0; k]; for stone in stones { reminders[stone % k] += 1; } reminders.iter().max().copied().unwrap_or(0) } fn main() { input! { n: usize, q: usize, a: [usize; q], } let primes = get_primes(n); let mut stones = HashSet::new(); for a in a { if !stones.remove(&a) { stones.insert(a); } if stones.len() < 3 { println!("{}", stones.len()); continue; } let limit = 2 * n / stones.len() + 1; let results = primes .iter() .take_while(|&&p| p <= limit) .map(|&p| count_for_k(&stones, p)) .collect::<Vec<_>>(); // eprintln!("{:?}", results); println!("{}", results.iter().max().unwrap()); } } |
English