挺好的构造,
l
o
w
b
i
t
lowbit
lowbit函数和对二进制的理解转化
题目链接
题目大意
给定整数 x x x,需要让 x x x变为 1 1 1,每次均需选择当前 x x x的除数作为减数,每个除数至多使用两次,输出递减过程的数。数据保证在 1000 1000 1000次以内有合法解法
思路
首先把
x
x
x转化为二进制
1..1..
1..1..
1..1..最后一位是
0
0
0或
1
1
1暂且不论,省略号中全是
0
0
0(可以是
0
0
0个)
需要两个循环
第一个循环,每次删除一个二进制最低位的一与后边的0组成的数,易知必为除数
第二个循环,此时
x
x
x为
1000..0
1000..0
1000..0,每次删一半即可
lowbit函数
作用是取得一个二进制最低位的一与后边的0组成的数
int lowbit(int x) {
return x & (-x);
}
ACcode
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
int lowbit(int x) {
return x & (-x);
}
void solve()
{
int x;cin >> x;
vector<int>a(1010);
int cnt = 0;
for (;x & (x - 1);x -= lowbit(x))a[++cnt] = x;
for (;x;x >>= 1)a[++cnt] = x;
cout << cnt << '\n';
for (int i = 1;i <= cnt;i++)cout << a[i] << ' ';
cout << '\n';
}
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}