事实上A操作的意图是将数字的末若干位取反。B操作含义是将数最后一位+1,并且进位。
考虑一个贪心,如果每次取将第一个0出现的位置往低位取反,然后最后在末尾+1,那么每次至少消去第一个0出现的位置的一个0
所以必然2步就可以至少删去1个0,那么显然可以在40步内完成任务。
本题主要需要注意,操作步数不一定是偶数,可能最后的B操作不做,操作步数是奇数的,需要特判。
```
# include <bits/stdc++.h>
using namespace std;
int base[25];
int ttt[100];
int getbit(int x)
{
int t=x,cnt=0;
while (t) t/=2,cnt++;
return cnt;
}
bool check(int x)
{
for (int i=0;i<=20;i++)
if (x==base[i]) return 1;
return 0;
}
int main()
{
int uuu=0;
int x,ans=0; scanf("%d",&x);
for (int i=0;i<=20;i++) base[i]=(1<<i)-1;
if (check(x)) {
puts("0"); return 0;
}
while (true) {
int p=getbit(x);
bool flag=false;
for (int i=p-2;i>=0;i--)
if (((1<<i)&x)==0) {
x=x^((1<<(i+1))-1); ttt[++ttt[0]]=i+1; uuu++;
if (check(x)) flag=true;
if (flag) break;
x=x+1; uuu++;
if (check(x)) flag=true;
if (flag) break;
break;
}
if (flag) break;
}
printf("%d\n",uuu);
for (int i=1;i<=ttt[0];i++)
printf("%d ",ttt[i]);
return 0;
}
```