結果

問題 No.887 Collatz
ユーザー tayu0110tayu0110
提出日時 2022-10-27 00:31:00
言語 Rust
(1.83.0 + proconio)
結果
AC  
実行時間 1 ms / 2,000 ms
コード長 4,888 bytes
コンパイル時間 12,158 ms
コンパイル使用メモリ 378,240 KB
実行使用メモリ 6,940 KB
最終ジャッジ日時 2024-07-04 12:19:30
合計ジャッジ時間 13,331 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 28
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

fn main() {
scan!(n: usize);
if n == 1 {
println!("0");
println!("{}", n);
return;
}
let i = (0..).scan(n, |s, _| if *s % 2 == 0 { *s /= 2; Some(*s) } else { *s = *s * 3 + 1; Some(*s) }).take_while(|c| c != &1).count()+1;
let max = (0..).scan(n, |s, _| if *s % 2 == 0 { *s /= 2; Some(*s) } else { *s = *s * 3 + 1; Some(*s) }).take_while(|c| c != &1).chain(vec![n]
        .into_iter()).max().unwrap();
println!("{}", i);
println!("{}", std::cmp::max(n, max));
}
mod iolib {
use std::cell::RefCell;
use std::io::{
Read, BufRead,
Error
};
use std::str::SplitWhitespace;
use std::thread_local;
thread_local! {
static BUF_SPLIT_WHITESPACE: RefCell<SplitWhitespace<'static>> = RefCell::new("".split_whitespace());
}
#[inline]
fn refill_buffer(interactive: bool) -> Result<(), Error> {
let mut s = String::new();
if cfg!(debug_assertions) || interactive {
std::io::stdin().lock().read_line(&mut s)?;
} else {
std::io::stdin().lock().read_to_string(&mut s)?;
}
BUF_SPLIT_WHITESPACE.with(|buf_str| {
*buf_str.borrow_mut() = Box::leak(s.into_boxed_str()).split_whitespace();
Ok(())
})
}
#[inline]
pub fn scan_string(interactive: bool) -> &'static str {
BUF_SPLIT_WHITESPACE.with(|buf_str| {
if let Some(s) = buf_str.borrow_mut().next() {
return s;
}
refill_buffer(interactive).unwrap();
if let Some(s) = buf_str.borrow_mut().next() {
return s;
}
unreachable!("Read Error: No input items.");
})
}
#[macro_export]
macro_rules! scan {
// Terminator
( @interactive : $interactive:literal ) => {};
// Terminator
( @interactive : $interactive:literal, ) => {};
// Vec<Vec<....>>
( @interactive : $interactive:literal, $v: ident : [ [ $( $inner:tt )+ ] ; $len:expr ]) => {
let $v = {
let len = $len;
(0..len).fold(vec![], |mut v, _| {
$crate::scan!(@interactive: $interactive, w: [ $( $inner )+ ]);
v.push(w);
v
})
};
};
// Vec<Vec<....>>, ......
( @interactive : $interactive:literal, $v: ident : [ [ $( $inner:tt )+ ] ; $len:expr ] , $( $rest:tt )* ) => {
$crate::scan!(@interactive: $interactive, [ [ $( $inner )+ ] ; $len ]);
$crate::scan!(@interactive: $interactive, $( $rest )*);
};
// Vec<$t>
( @interactive : $interactive:literal, $v:ident : [ $t:tt ; $len:expr ]) => {
let $v = {
let len = $len;
(0..len).map(|_| { $crate::scan!(@interactive: $interactive, $v : $t); $v }).collect::<Vec<_>>()
};
};
// Vec<$t>, .....
( @interactive : $interactive:literal, $v:ident : [ $t:tt ; $len:expr ] , $( $rest:tt )* ) => {
let $v = {
let len = $len;
(0..len).map(|_| { $crate::scan!(@interactive: $interactive, $v : $t); $v }).collect::<Vec<_>>()
};
$crate::scan!(@interactive: $interactive, $( $rest )*);
};
// Expand tuple
( @interactive : $interactive:literal, @expandtuple, ( $t:tt )) => {
{ let tmp = $crate::iolib::scan_string($interactive).parse::<$t>().unwrap(); tmp }
};
// Expand tuple
( @interactive : $interactive:literal, @expandtuple, ( $t:tt $( , $rest:tt )* ) ) => {
(
$crate::scan!(@interactive: $interactive, @expandtuple, ( $t )),
$( $crate::scan!(@interactive: $interactive, @expandtuple, ( $rest )), )*
)
};
// let $v: ($t, $u, ....) = (.......)
( @interactive : $interactive:literal, $v:ident : ( $( $rest:tt )* ) ) => {
let $v = $crate::scan!(@interactive: $interactive, @expandtuple, ( $( $rest )* ));
};
// let $v: $t = ......
( @interactive : $interactive:literal, $v:ident : $t:ty ) => {
let $v = $crate::iolib::scan_string($interactive).parse::<$t>().unwrap();
};
// let $v: $t = ......, .......
( @interactive : $interactive:literal, $v:ident : $t:ty, $( $rest:tt )+ ) => {
$crate::scan!(@interactive: $interactive, $v : $t);
$crate::scan!(@interactive: $interactive, $( $rest )+);
};
// ......
( $( $rest:tt )* ) => {
$crate::scan!(@interactive: false, $( $rest )*);
};
}
#[macro_export]
macro_rules! scani {
( $( $rest:tt )* ) => {
$crate::scan!(@interactive: true, $( $rest )*);
};
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0