题目大意:给定 𝑛, 𝑘 ,选出 𝑛 个 [1, 𝑘]
范围的整数,使得它们的异或和最大
对于普遍情况,我们可以把k二进制拆分完毕之后,除了最高位,别的位置都可以通过异或一个别的数字,使得除了最高位,别的都是1
考虑特殊情况:
也就是只能选择一个数字
这时候n为奇数就是1,否则为0
这时候n为奇数就是2,否则为3
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include <bits/stdc++.h> using namespace std;
int n, k, c[666];
signed main() { int i, x, num(0); cin >> n >> k, x = k; if (n == 1) cout << k, exit(0); if (k == 1) { if (n & 1) { puts("1"); } else puts("0"); return 0; } if (k == 2) { if (n & 1) { puts("2"); } else puts("3"); return 0; } while (x) c[++ num] = x % 2, x /= 2;
int res = 0; for (i = 1; i <= num - 1; ++ i) res += pow(2, i - 1); res += pow(2, num - 1) * c[num]; cout << res;
return 0; }
|
结语:一切杀不死我的,都将使我更加强大,排名靠前与倒数,只差一点,或许就在一念之间
虎瘦雄心在,人穷志不短,无论落魄到何种地步,都不要触碰做人的底线,心怀勇气的走下去,只有这样才能使得一切好起来