题解:P10307 「Cfz Round 2」Binary
szh_AK_all · · 题解
这题挺巧妙的。
分析
可以想想,对于一个数
所以,可以枚举进位个数
还需注意判断边界,即
Code
#include <bits/stdc++.h>
using namespace std;
int a[200005];
int k[200005];//记录答案
int qian[200005];
int qpow(int a, int b) {//没用,就当做防抄袭吧
int ans = 1;
while (b) {
if (b & 1)
ans *= a;
a *= a;
b /= 2;
}
return ans;
}
int main() {
int t;
cin >> t;
while (t--) {
int n;
scanf("%d", &n);
for (int i = 1; i <= n + 1; i++) {
scanf("%d", &a[i]);
qian[i] = qian[i - 1] ^ a[i];
}
for (int i = 0; i < n; i++) {
if (i == 0 && a[1] == 0)
k[n - 1]++;
else if (i != 0) {
if (qian[i] == a[i + 1])
k[n - (i + 1)]++;
}
}
if (qian[n] == a[n + 1])
k[0]++;
for (int i = 0; i <= n; i++) {
k[i + 1] += k[i] / 2;
k[i] %= 2;
}
int tot = n;
while (tot > 0 && k[tot] == 0)
tot--;
for (int i = tot; i >= 0; i--) {
cout << k[i];
k[i] = 0;//记得清空
}
cout << endl;
}
}