結果
問題 | No.6 使いものにならないハッシュ |
ユーザー | katand |
提出日時 | 2022-09-07 13:16:31 |
言語 | Rust (1.77.0 + proconio) |
結果 |
AC
|
実行時間 | 10 ms / 5,000 ms |
コード長 | 12,625 bytes |
コンパイル時間 | 15,262 ms |
コンパイル使用メモリ | 384,596 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-11-22 17:12:55 |
合計ジャッジ時間 | 14,851 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,816 KB |
testcase_01 | AC | 1 ms
6,816 KB |
testcase_02 | AC | 10 ms
6,820 KB |
testcase_03 | AC | 2 ms
6,816 KB |
testcase_04 | AC | 3 ms
6,816 KB |
testcase_05 | AC | 3 ms
6,816 KB |
testcase_06 | AC | 5 ms
6,820 KB |
testcase_07 | AC | 3 ms
6,820 KB |
testcase_08 | AC | 5 ms
6,816 KB |
testcase_09 | AC | 3 ms
6,820 KB |
testcase_10 | AC | 1 ms
6,816 KB |
testcase_11 | AC | 2 ms
6,816 KB |
testcase_12 | AC | 7 ms
6,816 KB |
testcase_13 | AC | 2 ms
6,816 KB |
testcase_14 | AC | 2 ms
6,816 KB |
testcase_15 | AC | 6 ms
6,816 KB |
testcase_16 | AC | 4 ms
6,816 KB |
testcase_17 | AC | 7 ms
6,820 KB |
testcase_18 | AC | 10 ms
6,820 KB |
testcase_19 | AC | 7 ms
6,816 KB |
testcase_20 | AC | 7 ms
6,820 KB |
testcase_21 | AC | 2 ms
6,816 KB |
testcase_22 | AC | 7 ms
6,816 KB |
testcase_23 | AC | 6 ms
6,820 KB |
testcase_24 | AC | 6 ms
6,816 KB |
testcase_25 | AC | 4 ms
6,816 KB |
testcase_26 | AC | 8 ms
6,820 KB |
testcase_27 | AC | 5 ms
6,820 KB |
testcase_28 | AC | 5 ms
6,816 KB |
testcase_29 | AC | 9 ms
6,820 KB |
testcase_30 | AC | 8 ms
6,816 KB |
testcase_31 | AC | 7 ms
6,816 KB |
ソースコード
pub struct Writer<W: Write> { writer: BufWriter<W>, } impl<W: Write> Writer<W> { pub fn new(write: W) -> Self { Self { writer: BufWriter::new(write), } } pub fn ln<S: Display>(&mut self, s: S) { writeln!(self.writer, "{}", s).expect("Failed to write.") } pub fn out<S: Display>(&mut self, s: S) { write!(self.writer, "{}", s).expect("Failed to write.") } pub fn join<S: Display>(&mut self, v: &[S], separator: &str) { v.iter().fold("", |sep, arg| { write!(self.writer, "{}{}", sep, arg).expect("Failed to write."); separator }); writeln!(self.writer).expect("Failed to write."); } pub fn bits(&mut self, i: i64, len: usize) { (0..len).for_each(|b| write!(self.writer, "{}", i >> b & 1).expect("Failed to write.")); writeln!(self.writer).expect("Failed to write.") } pub fn flush(&mut self) { let _ = self.writer.flush(); } } pub struct Reader<F> { init: F, buf: VecDeque<String>, } impl<R: BufRead, F: FnMut() -> R> Iterator for Reader<F> { type Item = String; fn next(&mut self) -> Option<String> { if self.buf.is_empty() { let mut reader = (self.init)(); let mut l = String::new(); reader.read_line(&mut l).unwrap(); self.buf .append(&mut l.split_whitespace().map(ToString::to_string).collect()); } self.buf.pop_front() } } impl<R: BufRead, F: FnMut() -> R> Reader<F> { pub fn new(init: F) -> Self { let buf = VecDeque::new(); Reader { init, buf } } pub fn v<T: FS>(&mut self) -> T { let s = self.next().expect("Insufficient input."); s.parse().ok().expect("Failed to parse.") } pub fn v2<T1: FS, T2: FS>(&mut self) -> (T1, T2) { (self.v(), self.v()) } pub fn v3<T1: FS, T2: FS, T3: FS>(&mut self) -> (T1, T2, T3) { (self.v(), self.v(), self.v()) } pub fn v4<T1: FS, T2: FS, T3: FS, T4: FS>(&mut self) -> (T1, T2, T3, T4) { (self.v(), self.v(), self.v(), self.v()) } pub fn v5<T1: FS, T2: FS, T3: FS, T4: FS, T5: FS>(&mut self) -> (T1, T2, T3, T4, T5) { (self.v(), self.v(), self.v(), self.v(), self.v()) } pub fn vec<T: FS>(&mut self, length: usize) -> Vec<T> { (0..length).map(|_| self.v()).collect() } pub fn vec2<T1: FS, T2: FS>(&mut self, length: usize) -> Vec<(T1, T2)> { (0..length).map(|_| self.v2()).collect() } pub fn vec3<T1: FS, T2: FS, T3: FS>(&mut self, length: usize) -> Vec<(T1, T2, T3)> { (0..length).map(|_| self.v3()).collect() } pub fn vec4<T1: FS, T2: FS, T3: FS, T4: FS>(&mut self, length: usize) -> Vec<(T1, T2, T3, T4)> { (0..length).map(|_| self.v4()).collect() } pub fn chars(&mut self) -> Vec<char> { self.v::<String>().chars().collect() } fn split(&mut self, zero: u8) -> Vec<usize> { self.v::<String>() .chars() .map(|c| (c as u8 - zero) as usize) .collect() } pub fn digits(&mut self) -> Vec<usize> { self.split(b'0') } pub fn lowercase(&mut self) -> Vec<usize> { self.split(b'a') } pub fn uppercase(&mut self) -> Vec<usize> { self.split(b'A') } pub fn char_map(&mut self, h: usize) -> Vec<Vec<char>> { (0..h).map(|_| self.chars()).collect() } pub fn bool_map(&mut self, h: usize, ng: char) -> Vec<Vec<bool>> { self.char_map(h) .iter() .map(|v| v.iter().map(|&c| c != ng).collect()) .collect() } pub fn matrix<T: FS>(&mut self, h: usize, w: usize) -> Vec<Vec<T>> { (0..h).map(|_| self.vec(w)).collect() } } pub fn to_lr<T, R: RangeBounds<T>>(range: &R, length: T) -> (T, T) where T: Copy + One + Zero + Add<Output = T> + PartialOrd, { use Bound::{Excluded, Included, Unbounded}; let l = match range.start_bound() { Unbounded => T::zero(), Included(&s) => s, Excluded(&s) => s + T::one(), }; let r = match range.end_bound() { Unbounded => length, Included(&e) => e + T::one(), Excluded(&e) => e, }; assert!(l <= r && r <= length); (l, r) } pub use std::{ cmp::{max, min, Ordering, Reverse}, collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, VecDeque}, convert::Infallible, convert::{TryFrom, TryInto}, fmt::{Debug, Display, Formatter}, io::{stdin, stdout, BufRead, BufWriter, Read, Write}, iter::{repeat, Product, Sum}, marker::PhantomData, mem::swap, ops::{ Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Bound, Deref, DerefMut, Div, DivAssign, Index, IndexMut, Mul, MulAssign, Neg, Not, Range, RangeBounds, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign, }, str::{from_utf8, FromStr as FS}, }; #[allow(unused_macros)] macro_rules ! chmin {($ base : expr , $ ($ cmps : expr ) ,+ $ (, ) * ) => {{let cmp_min = min ! ($ ($ cmps ) ,+ ) ; if $ base > cmp_min {$ base = cmp_min ; true } else {false } } } ; } #[allow(unused_macros)] macro_rules ! min {($ a : expr $ (, ) * ) => {{$ a } } ; ($ a : expr , $ b : expr $ (, ) * ) => {{if $ a > $ b {$ b } else {$ a } } } ; ($ a : expr , $ ($ rest : expr ) ,+ $ (, ) * ) => {{let b = min ! ($ ($ rest ) ,+ ) ; if $ a > b {b } else {$ a } } } ; } #[allow(unused_macros)] macro_rules ! chmax {($ base : expr , $ ($ cmps : expr ) ,+ $ (, ) * ) => {{let cmp_max = max ! ($ ($ cmps ) ,+ ) ; if $ base < cmp_max {$ base = cmp_max ; true } else {false } } } ; } #[allow(unused_macros)] macro_rules ! max {($ a : expr $ (, ) * ) => {{$ a } } ; ($ a : expr , $ b : expr $ (, ) * ) => {{if $ a > $ b {$ a } else {$ b } } } ; ($ a : expr , $ ($ rest : expr ) ,+ $ (, ) * ) => {{let b = max ! ($ ($ rest ) ,+ ) ; if $ a > b {$ a } else {b } } } ; } pub trait Magma { type M: Clone + PartialEq + Debug; fn op(x: &Self::M, y: &Self::M) -> Self::M; } pub trait Associative {} pub trait Unital: Magma { fn unit() -> Self::M; } pub trait Commutative: Magma {} pub trait Invertible: Magma { fn inv(x: &Self::M) -> Self::M; } pub trait Idempotent: Magma {} pub trait SemiGroup: Magma + Associative {} pub trait Monoid: Magma + Associative + Unital { fn pow(&self, x: Self::M, mut n: usize) -> Self::M { let mut res = Self::unit(); let mut base = x; while n > 0 { if n & 1 == 1 { res = Self::op(&res, &base); } base = Self::op(&base, &base); n >>= 1; } res } } impl<M: Magma + Associative + Unital> Monoid for M {} pub trait CommutativeMonoid: Magma + Associative + Unital + Commutative {} impl<M: Magma + Associative + Unital + Commutative> CommutativeMonoid for M {} pub trait Group: Magma + Associative + Unital + Invertible {} impl<M: Magma + Associative + Unital + Invertible> Group for M {} pub trait AbelianGroup: Magma + Associative + Unital + Commutative + Invertible {} impl<M: Magma + Associative + Unital + Commutative + Invertible> AbelianGroup for M {} pub trait Band: Magma + Associative + Idempotent {} impl<M: Magma + Associative + Idempotent> Band for M {} pub trait MapMonoid { type Mono: Monoid; type Func: Monoid; fn op( &self, x: &<Self::Mono as Magma>::M, y: &<Self::Mono as Magma>::M, ) -> <Self::Mono as Magma>::M { Self::Mono::op(x, y) } fn unit() -> <Self::Mono as Magma>::M { Self::Mono::unit() } fn apply( &self, f: &<Self::Func as Magma>::M, value: &<Self::Mono as Magma>::M, ) -> <Self::Mono as Magma>::M; fn identity_map() -> <Self::Func as Magma>::M { Self::Func::unit() } fn compose( &self, f: &<Self::Func as Magma>::M, g: &<Self::Func as Magma>::M, ) -> <Self::Func as Magma>::M { Self::Func::op(f, g) } } pub trait Zero { fn zero() -> Self; } pub trait One { fn one() -> Self; } pub trait BoundedBelow { fn min_value() -> Self; } pub trait BoundedAbove { fn max_value() -> Self; } # [rustfmt :: skip ] pub trait Integral : 'static + Send + Sync + Copy + Ord + Display + Debug + Add < Output = Self > + Sub < Output = Self > + Mul < Output = Self > + Div < Output = Self > + Rem < Output = Self > + AddAssign + SubAssign + MulAssign + DivAssign + RemAssign + Sum + Product + BitOr < Output = Self > + BitAnd < Output = Self > + BitXor < Output = Self > + Not < Output = Self > + Shl < Output = Self > + Shr < Output = Self > + BitOrAssign + BitAndAssign + BitXorAssign + ShlAssign + ShrAssign + Zero + One + BoundedBelow + BoundedAbove {} macro_rules ! impl_integral {($ ($ ty : ty ) ,* ) => {$ (impl Zero for $ ty {fn zero () -> Self {0 } } impl One for $ ty {fn one () -> Self {1 } } impl BoundedBelow for $ ty {fn min_value () -> Self {Self :: min_value () } } impl BoundedAbove for $ ty {fn max_value () -> Self {Self :: max_value () } } impl Integral for $ ty {} ) * } ; } impl_integral!(i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize); pub fn main() { let stdin = stdin(); let stdout = stdout(); solve(Reader::new(|| stdin.lock()), Writer::new(stdout.lock())); } pub trait SliceBounds { type Item: Ord; fn lower_bound(&self, k: &Self::Item) -> usize; fn upper_bound(&self, k: &Self::Item) -> usize; } pub trait SliceBoundsBy { type Item; fn lower_bound_by<F: FnMut(&Self::Item) -> Ordering>(&self, f: F) -> usize; fn upper_bound_by<F: FnMut(&Self::Item) -> Ordering>(&self, f: F) -> usize; } pub trait SliceBoundsByKey { type Item; fn lower_bound_by_key<K: Ord, F: FnMut(&Self::Item) -> K>(&self, k: &K, f: F) -> usize; fn upper_bound_by_key<K: Ord, F: FnMut(&Self::Item) -> K>(&self, k: &K, f: F) -> usize; } impl<T: Ord> SliceBounds for [T] { type Item = T; fn lower_bound(&self, k: &T) -> usize { self.lower_bound_by(|p| p.cmp(k)) } fn upper_bound(&self, k: &T) -> usize { self.upper_bound_by(|p| p.cmp(k)) } } impl<T> SliceBoundsBy for [T] { type Item = T; fn lower_bound_by<F: FnMut(&T) -> Ordering>(&self, mut f: F) -> usize { self.binary_search_by(|p| f(p).then(Ordering::Greater)) .unwrap_err() } fn upper_bound_by<F: FnMut(&T) -> Ordering>(&self, mut f: F) -> usize { self.binary_search_by(|p| f(p).then(Ordering::Less)) .unwrap_err() } } impl<T> SliceBoundsByKey for [T] { type Item = T; fn lower_bound_by_key<K: Ord, F: FnMut(&T) -> K>(&self, k: &K, mut f: F) -> usize { self.lower_bound_by(|p| f(p).cmp(k)) } fn upper_bound_by_key<K: Ord, F: FnMut(&T) -> K>(&self, k: &K, mut f: F) -> usize { self.upper_bound_by(|p| f(p).cmp(k)) } } pub fn solve<R: BufRead, W: Write, F: FnMut() -> R>(mut reader: Reader<F>, mut writer: Writer<W>) { let k: usize = reader.v(); let n: usize = reader.v(); let primes = primes(n); let mut v = Vec::new(); for p in primes { if p >= k { v.push(p); } } let mut pos = vec![Vec::new(); 10]; for i in 0..v.len() { let mut p = v[i]; while p > 9 { let d = int_to_digits(p); p = d.iter().fold(0, |x, a| x + a); } pos[p].push(i); } let mut max_len = 0; let mut ans = 0; for i in (0..v.len()).rev() { let mut lim = v.len(); for k in 1..10 { let next = pos[k].lower_bound(&i); if next < pos[k].len() { let limit = pos[k].upper_bound(&pos[k][next]); if limit < pos[k].len() { chmin!(lim, pos[k][limit]); } } } if chmax!(max_len, lim - i) { ans = v[i]; } } writer.ln(ans); } fn int_to_digits(mut n: usize) -> Vec<usize> { let mut ret = Vec::new(); if n == 0 { ret.push(0) } while n > 0 { ret.push(n % 10); n /= 10; } ret.reverse(); ret } pub fn primes(m: usize) -> Vec<usize> { if m < 2 { return Vec::new(); } if m == 2 { return vec![2]; } let mut b = vec![false; m + 1]; let mut ret = vec![2, 3]; let mut i = 5; let mut f = 4; while i <= m { if !b[i] { ret.push(i); for j in i..m / i + 1 { b[i * j] = true; } } f = 6 - f; i += f; } ret }