#include <iostream>
using namespace std;
int main() {
long long n;
cin>>n;
unsigned long long mask = 1;
while(mask<n){
mask = (mask<<1)|1;
}//通过按位或运算,找到一个二进制数有效位和n一样长的mask
n = n | mask;//纯属多余,直接输出mask即可。
cout<<n;
}
对于一个长度为n的排列,最大值n的二进制数的有效位一定是最长的,而且排列中的所有数通过任意的按位异或运算,得到的二进制数有效位不会超过n的二进制数有效位,所有只需要让n中所有的0通过按位异或运算变成1,那么这个数一定是最大的;

京公网安备 11010502036488号