Codeforces Round #554 (Div. 2) Neko Performs Cat Furrier Transform
题目大意
就是给你一个数 x , 两种操作,最后必须让x = 2n - 1 { n | n >= 0 }
- 奇数操作 x xor 2n - 1
- 偶数 x + 1
然后让你给出每次奇数操作的数
我写的是模拟,每次 xor 除后缀的最低位的连续0的最高位的 0 的位置 n 2n - 1
比如 110100100 就是 xor 11111
值得一提的是官方题解是有bfs版本的,看了下代码风格很奇葩,但不算丑(根本很难看下去啊喂
整体思路好像貌似就是暴力搜一遍..(说实话他的代码是真的恶心到我了 口区
#include <bits/stdc++.h>
using namespace std;
inline int lowbit(int x) {
return x&-x;
}
inline bool is2(int x) {
x += 1;
return (x&-x) == x;
}
int log2(int x) { //编译参数好像出了点问题就手写了一个
int i = 0;
for (i = 0; x != 0; i++) {
x /= 2;
}
return i;
}
int hight0(int x) {
for (int i = 0; x != 0 ; i++) {
if (lowbit(x) == (1 << i))
x ^= (1 << i);
else return lowbit(x) - 1;
}
return 0;
}
int n;
queue<int> ans;
int main() {
cin >> n;
int i = 0;
for (i = 0; !is2(n); i++) {
if (i % 2 == 0) {
int op = hight0(n);
ans.push(op);
n ^= op;
} else n += 1;
}
if (ans.size() == 0) {
cout << "0" << endl;
return;
}
cout << i << endl << log2(ans.front() + 1) - 1; ans.pop();
while(!ans.empty()) {
cout << " " << log2(ans.front() + 1) - 1;
ans.pop();
}
}
最后分享一种魔鬼写法
#include <bits/stdc++.h>
using namespace std;
int x;
vector<int> ans;
int main() {
cin >> x;
int len = 32 - __builtin_clz(x);
ans.push_back(0); //都跟样例不一样233
for (int i = 0; i < len; i++) {
int last = (x >> i) & 1;
if (last == 0) ans.push_back(i);
}
cout << ans.size() * 2 - 1 << '\n';
for (int i : ans) cout << i << " ";
return 0;
}