题解:P17867 [FJCPC 2026] 哦 搞错了
Fine_Dust_Z · · 题解
先提问:周处除三害,三害是哪三害?
赛时卡了,吃了好多发。。。这个
考虑这个构造
证明应该不难:设当前
所以我们就有一个构造方案:我们首先让
现在问题就只剩下一个了:怎么保证
:::success[code]
#include <bits/stdc++.h>
#define int long long
using namespace std;
void write(int x) {
static int sta[40];
int top = 0;
do {
sta[top++] = x % 10;
x /= 10;
} while (x);
while (top) putchar('0' + sta[--top]);
putchar(' ');
}
string s;
int cnt_0,cnt_1;
__int128_t ans[100005],cnt,tot;
signed main(){
cin>>s;
for(int i=0;i<s.size();i++)cnt_1^=(s[i]=='1');
ans[0]=1;
for(int i=1;i<=59;i++)ans[0]*=2;
for(int i=1;i<=100000;i++)ans[i]=ans[0]+(++cnt);
if(cnt_1){
for(int i=0;i<s.size();i++){
if(s[i]=='1'){
write(ans[++tot]);
}
else{
write(++tot);
}
}
}
else{
bool flag=true;
for(int i=0;i<s.size();i++){
if(s[i]=='1'){
if(flag){
write(++tot);
flag=!flag;
}
else write(ans[++tot]);
}
else{
if(flag){
write(ans[++tot]);
flag=!flag;
}
else{
write((++tot));
}
}
}
}
return 0;
}
/*
如果是 0 那么 A_i = (59位01串保证不重集)
否则是 1 那么 A_i = 1(59位01串保证不重集)
1 的个数是奇数就万事大吉,否则把一个数翻转
*/
:::