結果
| 問題 | 
                            No.1243 約数加算
                             | 
                    
| コンテスト | |
| ユーザー | 
                             ngtkana
                         | 
                    
| 提出日時 | 2020-07-01 23:28:06 | 
| 言語 | Rust  (1.83.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 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 1 | 
| other | AC * 9 | 
ソースコード
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()
                })
        );
    }
}
            
            
            
        
            
ngtkana