結果

問題 No.1243 約数加算
ユーザー ngtkanangtkana
提出日時 2020-07-01 23:28:06
言語 Rust
(1.77.0 + proconio)
結果
AC  
実行時間 2 ms / 2,000 ms
コード長 2,273 bytes
コンパイル時間 12,359 ms
コンパイル使用メモリ 378,372 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-07-04 09:45:44
合計ジャッジ時間 13,513 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 1 ms
5,376 KB
testcase_02 AC 1 ms
5,376 KB
testcase_03 AC 1 ms
5,376 KB
testcase_04 AC 1 ms
5,376 KB
testcase_05 AC 2 ms
5,376 KB
testcase_06 AC 2 ms
5,376 KB
testcase_07 AC 1 ms
5,376 KB
testcase_08 AC 2 ms
5,376 KB
testcase_09 AC 1 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

use std::{convert::identity, io::stdin};

pub trait Boolinator: Sized {
    fn as_some_from<T, F>(self, some: F) -> Option<T>
    where
        F: FnOnce() -> T;
}

impl Boolinator for bool {
    fn as_some_from<T, F>(self, some: F) -> Option<T>
    where
        F: FnOnce() -> T,
    {
        if self {
            Some(some())
        } else {
            None
        }
    }
}

pub enum Either<L, R> {
    Left(L),
    Right(R),
}

fn main() {
    let q = {
        let mut s = String::new();
        stdin().read_line(&mut s).unwrap();
        let q = s.trim_end().to_owned().parse::<usize>().unwrap();
        assert!(q <= 100);
        q
    };

    for _ in 0..q {
        let (a, b) = {
            let mut s = String::new();
            stdin().read_line(&mut s).unwrap();
            let s = s.trim_end().to_owned();
            let mut s = s.split_whitespace();
            let a = s.next().unwrap().parse::<u64>().unwrap();
            let b = s.next().unwrap().parse::<u64>().unwrap();
            assert!(1 <= a && a < b && b <= 10u64.pow(18));
            (a, b)
        };

        let ans: Vec<u64> = (0..60)
            .map(|i| Either::Left(i))
            .chain((0..60).rev().map(|i| Either::Right(i)))
            .scan(a, |a, e| {
                Some(match e {
                    Either::Left(i) => {
                        let x = 1u64 << i;
                        ((*a >> i & 1) == 1 && *a + x <= b).as_some_from(|| {
                            *a += x;
                            x
                        })
                    }
                    Either::Right(i) => {
                        let x = 1u64 << i;
                        (*a + x <= b).as_some_from(|| {
                            *a += x;
                            x
                        })
                    }
                })
            })
            .filter_map(identity)
            .collect();

        println!("{}", ans.len());
        println!(
            "{}",
            ans.iter()
                .map(ToString::to_string)
                .enumerate()
                .fold("".to_string(), |acc, (i, s)| if i == 0 {
                    s
                } else {
                    acc + " " + s.as_str()
                })
        );
    }
}
0