1 条题解

  • 0
    @ 2025-8-24 22:48:58

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 残阳如血
    人事已尽,天命难违

    搬运于2025-08-24 22:48:58,当前版本为作者最后更新于2023-08-06 15:14:21,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    普通模拟的别的题解应该都有了,现在我来介绍一种不同寻常的偷懒方法!

    思路分析

    确定最大值

    题目要我们求 2m2^m 次方,常规的方法是对于 mm 一个一个试过去,最终找到答案。

    但是,我们可以发现,mm 不就是 log2n\log_2 n 嘛!(不考虑偶数和小于的条件下)

    所以我们可以使用 C++ 中的 log2() 函数,快速求出 log2n\log_2 n 的值。

    不过,可不能这样结束。

    进行微调

    题目中提到了,要使 2m<n2^m<n,所以如果 nn22 的幂次,那么 2m2^m 就会与 nn 相等这不符合题意。所以,我们需要特判 2m2^m 是否与 nn 相等,如果相等就将 mm 减少 11

    另外,题目强烈提醒我们 mm 一定为偶数,所以,在执行上一个调整后,我们还要判断 mm 是否为奇数。如果是,那么我们还要将 mm 减少 11

    程序实现

    #include <bits/stdc++.h>
    using namespace std;
    int n;
    int main() {
    	cin >> n;
    	int m = floor(log2(n)); // 将log2(n)的值向下取整
    	if ((1 << m) == n) m--; // 第一类微调
    	if (m & 1) m--; // 第二类微调
    	cout << m;
    	return 0;
    }
    
    • 1

    信息

    ID
    8924
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者