CF1864C的题解

(一)

可以将 \(x\) 转为二进制。

考虑一个数的二进制 \((1\dots10\dots0)\)

其中,第一个省略号中有什么不确定,第二个省略号里都是 \(0\)

易得,每个数都可以看成这种形式。

那么可以每次去掉最后一位的 \(1\),易证减去的数是原数的因数。

最后会得到形如 \((10\dots0)\),省略号中全是 \(0\)

此时从最大一位往后依次把每一位去掉即可。

(二)

AC 代码。

简洁明了。

#include<bits/stdc++.h>
using namespace std;
int t,cnt,x,a[1010];
int lowbit(int x){
	return x&-x;
}
int main(){
	cin>>t;
	while(t--){
		cin>>x,cnt=0;
		for(;x&(x-1);x-=lowbit(x))a[++cnt]=x;
		for(;x;x>>=1)a[++cnt]=x;
		cout<<cnt<<endl;
		for(int i=1;i<=cnt;i++)cout<<a[i]<<" ";
		cout<<endl;
	}
	return 0;
}
posted @ 2024-03-27 12:33  Jerry_heng  阅读(3)  评论(0编辑  收藏  举报