結果

問題 No.3624 Product
コンテスト
ユーザー urectanc
提出日時 2026-08-14 22:16:48
言語 Rust
(1.94.0 + proconio + num + itertools)
コンパイル:
/usr/bin/rustc_custom
実行:
./target/release/main
結果
AC  
実行時間 20 ms / 2,000 ms
+ 577µs
コード長 1,652 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,032 ms
コンパイル使用メモリ 198,680 KB
実行使用メモリ 9,388 KB
最終ジャッジ日時 2026-08-14 22:16:52
合計ジャッジ時間 2,753 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge3_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 12
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

// msbが同じならng
// 異なるときは?
// rが0ならlは1をとってよい
// (r+2^k)*l < r*(l+2^k)
// 要するに2^k * (2^k - 1)

use proconio::{fastout, input};

#[fastout]
fn main() {
    input! { t: usize }

    for _ in 0..t {
        input! {
            l: usize, r: usize,
        }
        let ans = solve(l, r);
        println!("{}", ans as isize);
    }
}

fn solve(l: usize, r: usize) -> usize {
    if (l, r) == (0, 0) {
        return 0;
    }
    for k in (0..=30).rev() {
        let b = 1 << k;
        let a = b - 1;
        if (l..=r).contains(&a) && (l..=r).contains(&b) {
            return a * b;
        }
    }
    !0
}

#[cfg(test)]
mod tests {
    use rand::RngExt;

    use super::*;

    fn testcase(rng: &mut impl rand::Rng) -> (usize, usize) {
        let l = rng.random_range(0..100);
        let r = rng.random_range(l..100);
        (l, r)
    }

    fn naive(l: usize, r: usize) -> usize {
        let (l, r) = (l as isize, r as isize);
        let mut max = -1;
        for a in l..=r {
            for b in a..=r {
                if a & b == 0 {
                    max = max.max(a * b);
                }
            }
        }
        max as usize
    }

    #[test]
    fn stress() {
        const T: usize = 100000;
        let mut rng = rand::rng();

        let killer = vec![];
        let testcases = killer
            .into_iter()
            .chain(std::iter::repeat_with(|| testcase(&mut rng)).take(T));

        for (l, r) in testcases {
            let expected = naive(l, r);
            let actual = solve(l, r);
            assert_eq!(expected, actual, "{l} {r}");
        }
    }
}
0