首页 > 试题广场 >

76选数

[编程题]76选数
  • 热度指数:43 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
76 有一个长度为 n 的排列,他想从排列里选择任意个数字,进行按位异或操作,得到一个新的整数 m
但他不知道如何选择,才能让 m 最大,请你帮他选一下,然后输出最大的 m

输入描述:
输入一个整数 n\ (\ 1 \leq n \leq 10^{18}\ ) ,代表排列的长度 。
因为选择数字与元素顺序无关,这里不给出具体排列。


输出描述:
输出一个整数 m
示例1

输入

2

输出

3
#include<bits/stdc++.h>
//其实是找2的次方数最大是多少
//例如7,最大次方数是4那最大的数就是111
using namespace std;
int main(){
    long long n;
    cin>>n;
    long long s=1;
    while(n>=2){s=s*2+1; n=n/2;}
    cout<<s;
    return 0;
}

发表于 2025-12-02 17:41:25 回复(0)
//n的排列(即1,2,...n)能异或得到的最大值m就是n的位数的全一数
//我们只需得到n的二进制位数后构造该位数的全一数即可得到m
//例如 5 ,二进制就是101  , 二进制有3位  , 对应的全一数(111)的十进制就是7 (2的n的位数次方-1)
#include <iostream>
using namespace std;
typedef long long ll;
int main() {
    ll a;
    cin>>a;
    ll tmp = a;
    ll cnt=0;
    while(tmp>0){
        tmp>>=1;
        cnt++;
    }
    cout << (1LL<<cnt)-1;
}


发表于 2025-12-02 14:10:50 回复(0)