結果
問題 | No.1140 EXPotentiaLLL! |
ユーザー | へのく |
提出日時 | 2021-07-03 01:12:04 |
言語 | Rust (1.77.0 + proconio) |
結果 |
AC
|
実行時間 | 237 ms / 2,000 ms |
コード長 | 10,349 bytes |
コンパイル時間 | 12,704 ms |
コンパイル使用メモリ | 384,676 KB |
実行使用メモリ | 37,464 KB |
最終ジャッジ日時 | 2024-06-29 17:35:08 |
合計ジャッジ時間 | 16,608 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 234 ms
37,080 KB |
testcase_01 | AC | 228 ms
37,464 KB |
testcase_02 | AC | 237 ms
37,080 KB |
testcase_03 | AC | 179 ms
31,368 KB |
testcase_04 | AC | 137 ms
25,436 KB |
testcase_05 | AC | 201 ms
36,824 KB |
testcase_06 | AC | 202 ms
35,416 KB |
testcase_07 | AC | 232 ms
37,080 KB |
testcase_08 | AC | 38 ms
9,472 KB |
testcase_09 | AC | 38 ms
9,472 KB |
testcase_10 | AC | 38 ms
9,472 KB |
testcase_11 | AC | 38 ms
9,472 KB |
testcase_12 | AC | 38 ms
9,472 KB |
ソースコード
#![allow(non_snake_case)] use crate::primes::utils::sieve; #[allow(unused_imports)] use crate::{arraylist::List, scanner::Scanner}; fn main() { let mut scan = Scanner::new(); let t = scan.int(); let (_, is_prime) = sieve(5000000); let mut ret = list![]; for _ in 0..t { let a = scan.int(); let p = scan.int(); ret.push(if is_prime[p] { if a % p == 0 { 0 } else { 1 } } else { -1 }); } println!("{}", ret.join("\n")); } pub mod scanner { use std::io::{stdin, BufReader, Bytes, Read, Stdin}; use crate::types::*; use std::str::FromStr; pub struct Scanner { buf: Bytes<BufReader<Stdin>>, } impl Scanner { pub fn new() -> Scanner { Scanner { buf: BufReader::new(stdin()).bytes(), } } #[inline] fn token<T: std::iter::FromIterator<char>>(&mut self) -> T { self.buf .by_ref() .map(|c| c.unwrap() as char) .skip_while(|c| c.is_whitespace()) .take_while(|c| !c.is_whitespace()) .collect() } #[inline] pub fn read<T: FromStr>(&mut self) -> T { self.string().parse().ok().unwrap() } #[inline] pub fn string(&mut self) -> String { self.token() } #[inline] pub fn int(&mut self) -> idx { self.read() } } } pub mod types { pub use crate::arraylist::List as Seq; #[allow(non_camel_case_types)] pub type idx = isize; pub use crate::list as seq; pub use std::collections::hash_map as map; pub use std::collections::HashMap as Map; } pub mod primes { pub mod utils { use crate::arraylist::List; pub fn sieve(n: isize) -> (List<isize>, List<bool>) { let mut primes = List::new(); let mut is_prime = List::init(true, n + 1); is_prime.fill(0..=1, false); for i in 2..n + 1 { if is_prime[i] { primes.push(i); for j in (2..).map(|j| j * i).take_while(|&j| j <= n) { is_prime[j] = false; } } } (primes, is_prime) } } } pub mod arraylist { use std::ops::*; use std::slice::Iter; use std::fmt::Formatter; use std::iter::FromIterator; #[derive(Clone, PartialEq, Eq, PartialOrd, Ord)] pub struct List<T> { pub data: Vec<T>, } impl<T> List<T> { #[inline] pub fn new() -> List<T> { List { data: vec![] } } #[inline] pub fn init(init: T, n: isize) -> List<T> where T: Clone, { List { data: vec![init; n as usize], } } #[inline] pub fn push(&mut self, item: T) { self.data.push(item); } } macro_rules! impl_idx { ($($tpe:ty, $t:ident [$($output:tt)+], $slf:ident, $index:ident, $f:expr),*) => { $(impl<$t> Index<$tpe> for List<$t> { type Output = $($output)+; #[inline] fn index(&$slf, $index: $tpe) -> &Self::Output {$f} })* $(impl<$t> Index<$tpe> for lst<$t> { type Output = $($output)+; #[inline] fn index(&$slf, $index: $tpe) -> &Self::Output {$f} })* } } macro_rules! impl_idx_mut { ($($tpe:ty, $slf:ident, $index:ident, $f:expr),*) => { $(impl<T> IndexMut<$tpe> for List<T> { #[inline] fn index_mut(&mut $slf, $index: $tpe) -> &mut Self::Output {$f} })* $(impl<T> IndexMut<$tpe> for lst<T> { #[inline] fn index_mut(&mut $slf, $index: $tpe) -> &mut Self::Output {$f} })* }; } macro_rules! impl_idx_slice { ($($tpe:ty),*) => { impl_idx!($($tpe, T [lst<T>], self, i, self.as_slice(i)),*); impl_idx_mut!($($tpe, self, i, self.as_slice_mut(i)),*); }; } impl_idx! { isize, T [T], self, i, self.at(i), char, T [T], self, i, self.at(i as isize - 'a' as isize) } impl_idx_slice! { Range<isize>, RangeTo<isize>, RangeFrom<isize>, RangeFull, RangeInclusive<isize>, RangeToInclusive<isize> } impl_idx_mut! { isize, self, i, self.at_mut(i), char, self, i, self.at_mut(i as isize - 'a' as isize) } impl<T> FromIterator<T> for List<T> { #[inline] fn from_iter<U: IntoIterator<Item = T>>(iter: U) -> Self { List { data: iter.into_iter().collect(), } } } impl<T> IntoIterator for List<T> { type Item = T; type IntoIter = std::vec::IntoIter<T>; #[inline] fn into_iter(self) -> std::vec::IntoIter<T> { self.data.into_iter() } } macro_rules! impl_traits { ($($tpe:tt),*) => { $( impl<T: std::fmt::Display> std::fmt::Display for $tpe<T> { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!(f, "{}", self.iter().map(|x| format!("{}", x)).collect::<Vec<_>>().join(" ")) } } impl<T: std::fmt::Debug> std::fmt::Debug for $tpe<T> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { self.data.fmt(f) } } impl<'a, T> IntoIterator for &'a $tpe<T> { type Item = &'a T; type IntoIter = Iter<'a, T>; #[inline] fn into_iter(self) -> Iter<'a, T> { self.iter() } } )* }; } impl_traits!(List, lst); impl<T> From<Vec<T>> for List<T> { #[inline] fn from(vec: Vec<T>) -> Self { List { data: vec } } } impl<T: Clone> From<&[T]> for List<T> { #[inline] fn from(slice: &[T]) -> Self { slice.iter().cloned().collect() } } impl<T> Deref for List<T> { type Target = lst<T>; #[inline] fn deref(&self) -> &lst<T> { lst::new(&self.data) } } impl<T> DerefMut for List<T> { #[inline] fn deref_mut(&mut self) -> &mut lst<T> { lst::new_mut(&mut self.data) } } #[macro_export] macro_rules! list { () => { $crate::arraylist::List::new() }; ($($v:expr),+ $(,)?) => { $crate::arraylist::List::from([$($v),+].to_vec()) }; ($v:expr; $a:expr) => { $crate::arraylist::List::init($v, $a)}; ($v:expr; $a:expr; $($rest:expr);+) => { $crate::arraylist::List::init(list!($v; $($rest);+), $a) }; } #[allow(non_camel_case_types)] #[derive(PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] pub struct lst<T> { data: [T], } impl<T> lst<T> { #[inline] pub fn new(slice: &[T]) -> &Self { unsafe { &*(slice as *const [T] as *const Self) } } #[inline] pub fn new_mut(slice: &mut [T]) -> &mut Self { unsafe { &mut *(slice as *mut [T] as *mut Self) } } #[inline] fn at(&self, index: isize) -> &T { if cfg!(debug_assertions) { self.data.index(index as usize) } else { unsafe { self.data.get_unchecked(index as usize) } } } #[inline] fn at_mut(&mut self, index: isize) -> &mut T { if cfg!(debug_assertions) { self.data.index_mut(index as usize) } else { unsafe { self.data.get_unchecked_mut(index as usize) } } } #[inline] pub fn as_slice(&self, range: impl RangeBounds<isize>) -> &lst<T> { if cfg!(debug_assertions) { lst::new(self.data.index(self.rgm(range))) } else { unsafe { lst::new(self.data.get_unchecked(self.rgm(range))) } } } #[inline] pub fn as_slice_mut(&mut self, range: impl RangeBounds<isize>) -> &mut lst<T> { if cfg!(debug_assertions) { lst::new_mut(self.data.index_mut(self.rgm(range))) } else { let r = self.rgm(range); unsafe { lst::new_mut(self.data.get_unchecked_mut(r)) } } } #[inline] pub fn join(&self, sep: &str) -> String where T: std::fmt::Display, { self.iter() .map(|x| format!("{}", x)) .collect::<Vec<_>>() .join(sep) } #[inline] pub fn fill(&mut self, r: impl RangeBounds<isize>, item: T) where T: Clone, { for i in self.rgm(r) { self.data[i] = item.clone(); } } #[inline] fn rgm(&self, r: impl RangeBounds<isize>) -> Range<usize> { (match r.start_bound() { Bound::Included(x) => *x as usize, Bound::Excluded(x) => *x as usize + 1, _ => 0, }) .max(0)..(match r.end_bound() { Bound::Included(x) => *x as usize + 1, Bound::Excluded(x) => *x as usize, _ => self.data.len(), }) .min(self.data.len()) } } impl lst<isize> {} impl<T> Deref for lst<T> { type Target = [T]; #[inline] fn deref(&self) -> &[T] { &self.data } } impl<T> DerefMut for lst<T> { #[inline] fn deref_mut(&mut self) -> &mut [T] { &mut self.data } } impl<'a, T> From<&'a [T]> for &'a lst<T> { #[inline] fn from(slice: &'a [T]) -> Self { lst::new(slice) } } }