Submission #64520789
Source Code Expand
Copy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//#[derive_readable]
#[derive(Debug, Clone)]
struct Problem {
n: i64,
}
impl Problem {
fn read() -> Problem {
input! {
n: i64,
}
Problem { n }
}
fn solve(&self) -> Answer {
let n = self.n;
let ans = (1..=61)
.map(|a| {
bin_search(0, 1_000_000_000, |c| {
(2 * c - 1) * (2 * c - 1) <= n / (1 << a)
})
})
.sum::<i64>();
Answer { ans }
}
#[allow(dead_code)]
fn solve_naive(&self) -> Answer {
todo!();
// let ans = 0;
// Answer { ans }
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
struct Answer {
ans: i64,
}
impl Answer {
fn print(&self) {
println!("{}", self.ans);
}
}
fn main() {
Problem::read().solve().print();
}
#[cfg(test)]
mod tests {
#[allow(unused_imports)]
use super::*;
#[allow(unused_imports)]
use rand::{rngs::SmallRng, seq::SliceRandom, *};
#[test]
fn test_problem() {
assert_eq!(1 + 1, 2);
}
#[allow(dead_code)]
#[derive(Debug)]
struct WrongTestCase {
problem: Problem,
main_ans: Answer,
naive_ans: Answer,
}
#[allow(dead_code)]
fn check(p: &Problem) -> Option<WrongTestCase> {
let main_ans = p.solve();
let naive_ans = p.solve_naive();
if main_ans != naive_ans {
Some(WrongTestCase {
problem: p.clone(),
main_ans,
naive_ans,
})
} else {
None
}
}
#[allow(dead_code)]
fn make_random_problem(rng: &mut SmallRng) -> Problem {
todo!()
// let n = rng.gen_range(1..=10);
// let p = Problem { _a: n };
// println!("{:?}", &p);
// p
}
#[allow(unreachable_code)]
#[test]
fn test_with_naive() {
let num_tests = 0;
let max_wrong_case = 10; // この件数間違いが見つかったら打ち切り
let mut rng = SmallRng::seed_from_u64(42);
// let mut rng = SmallRng::from_entropy();
let mut wrong_cases: Vec<WrongTestCase> = vec![];
for _ in 0..num_tests {
let p = make_random_problem(&mut rng);
let result = check(&p);
if let Some(wrong_test_case) = result {
wrong_cases.push(wrong_test_case);
}
if wrong_cases.len() >= max_wrong_case {
break;
}
}
if !wrong_cases.is_empty() {
for t in &wrong_cases {
println!("{:?}", t.problem);
println!("main ans : {:?}", t.main_ans);
println!("naive ans: {:?}", t.naive_ans);
println!();
}
println!("{} cases are wrong.", wrong_cases.len());
panic!();
}
}
}
// ====== import ======
#[allow(unused_imports)]
use itertools::{chain, iproduct, izip, Itertools};
#[allow(unused_imports)]
use proconio::{
derive_readable, fastout, input,
marker::{Bytes, Chars, Usize1},
};
#[allow(unused_imports)]
use std::cmp::Reverse;
#[allow(unused_imports)]
use std::collections::{BinaryHeap, HashMap, HashSet};
// ====== output func ======
#[allow(unused_imports)]
use print_vec::*;
pub mod print_vec {
use itertools::Itertools;
use proconio::fastout;
#[fastout]
pub fn print_vec<T: std::fmt::Display>(arr: &[T]) {
for a in arr {
println!("{}", a);
}
}
#[fastout]
pub fn print_vec_1line<T: std::fmt::Display>(arr: &[T]) {
let msg = arr.iter().map(|x| format!("{}", x)).join(" ");
println!("{}", msg);
}
#[fastout]
pub fn print_vec2<T: std::fmt::Display>(arr: &Vec<Vec<T>>) {
for row in arr {
let msg = row.iter().map(|x| format!("{}", x)).join(" ");
println!("{}", msg);
}
}
pub fn print_bytes(bytes: &[u8]) {
let msg = String::from_utf8(bytes.to_vec()).unwrap();
println!("{}", msg);
}
pub fn print_chars(chars: &[char]) {
let msg = chars.iter().collect::<String>();
println!("{}", msg);
}
#[fastout]
pub fn print_vec_bytes(vec_bytes: &[Vec<u8>]) {
for row in vec_bytes {
let msg = String::from_utf8(row.to_vec()).unwrap();
println!("{}", msg);
}
}
}
#[allow(unused)]
fn print_yesno(ans: bool) {
let msg = if ans { "Yes" } else { "No" };
println!("{}", msg);
}
// ====== snippet ======
/// 二分探索をする
/// ```text
/// ng ng ng ok ok ok
/// ↑ここの引数の値を返す
/// ```
/// 計算量: O(log(|ok - ng|))
/// ## Arguments
/// * ok != ng
/// * |ok - ng| <= 2^63 - 1, |ok + ng| <= 2^63 - 1
/// * p の定義域について
/// * ng < ok の場合、p は区間 ng..ok で定義されている。
/// * ok < ng の場合、p は区間 ok..ng で定義されている。
/// * p の単調性について
/// * ng < ok の場合、p は単調増加
/// * ok < ng の場合、p は単調減少
/// ## Return
/// * ng < ok の場合: I = { i in ng..ok | p(i) == true } としたとき
/// * I が空でなければ、min I を返す。
/// * I が空ならば、ok を返す。
/// * ok < ng の場合: I = { i in ok..ng | p(i) == true } としたとき
/// * I が空でなければ、max I を返す。
/// * I が空ならば、ok を返す。
pub fn bin_search<F>(mut ok: i64, mut ng: i64, mut p: F) -> i64
where
F: FnMut(i64) -> bool,
{
debug_assert!(ok != ng);
debug_assert!(ok.checked_sub(ng).is_some());
debug_assert!(ok.checked_add(ng).is_some());
while num::abs(ok - ng) > 1 {
let mid = (ok + ng) / 2;
debug_assert!(mid != ok);
debug_assert!(mid != ng);
if p(mid) {
ok = mid;
} else {
ng = mid;
}
}
ok
}
Submission Info
Submission Time |
|
Task |
C - 2^a b^2 |
User |
paruma184 |
Language |
Rust (rustc 1.70.0) |
Score |
350 |
Code Size |
5947 Byte |
Status |
AC |
Exec Time |
1 ms |
Memory |
2092 KB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
350 / 350 |
Status |
|
|
Set Name |
Test Cases |
Sample |
example_00.txt, example_01.txt, example_02.txt |
All |
example_00.txt, example_01.txt, example_02.txt, hand_00.txt, hand_01.txt, hand_02.txt, hand_03.txt, hand_04.txt, hand_05.txt, hand_06.txt, hand_07.txt, hand_08.txt, hand_09.txt, hand_10.txt, random_00.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt |
Case Name |
Status |
Exec Time |
Memory |
example_00.txt |
AC |
1 ms |
1924 KB |
example_01.txt |
AC |
1 ms |
1956 KB |
example_02.txt |
AC |
1 ms |
2088 KB |
hand_00.txt |
AC |
0 ms |
1944 KB |
hand_01.txt |
AC |
0 ms |
1860 KB |
hand_02.txt |
AC |
0 ms |
2012 KB |
hand_03.txt |
AC |
0 ms |
1988 KB |
hand_04.txt |
AC |
0 ms |
1940 KB |
hand_05.txt |
AC |
0 ms |
1864 KB |
hand_06.txt |
AC |
0 ms |
1936 KB |
hand_07.txt |
AC |
1 ms |
1912 KB |
hand_08.txt |
AC |
0 ms |
1984 KB |
hand_09.txt |
AC |
1 ms |
2072 KB |
hand_10.txt |
AC |
1 ms |
2072 KB |
random_00.txt |
AC |
1 ms |
2092 KB |
random_01.txt |
AC |
0 ms |
2076 KB |
random_02.txt |
AC |
0 ms |
1868 KB |
random_03.txt |
AC |
0 ms |
1924 KB |
random_04.txt |
AC |
0 ms |
2068 KB |
random_05.txt |
AC |
0 ms |
1980 KB |
random_06.txt |
AC |
0 ms |
1928 KB |
random_07.txt |
AC |
0 ms |
1744 KB |
random_08.txt |
AC |
0 ms |
1868 KB |
random_09.txt |
AC |
0 ms |
1904 KB |
random_10.txt |
AC |
0 ms |
1928 KB |
random_11.txt |
AC |
1 ms |
1984 KB |
random_12.txt |
AC |
0 ms |
1944 KB |
random_13.txt |
AC |
1 ms |
1932 KB |
random_14.txt |
AC |
1 ms |
2088 KB |