CF1864C 题解

\(x = 2^k\) 是好做的,每次以 \(2^{k-1}\) 为因数即可。

对于其他情况,考虑每次让 \(x\) 减去其二进制下最低位的 \(1\) 直至变成 \(2^k\)

这种策略下显然每个数只会在以上两个大步骤下取到,故每个数使用不超过 \(2\) 次。

同时操作次数在 \(O(\log n)\) 这个量级。

#include<bits/stdc++.h>
//#define int long long
#define lowbit(x) (x&-(x))
using namespace std;
//const int maxn =
map<int,int> cnt;
int w(int x){
	int res=0;
	for(int i=2;i<=sqrt(x);i++){
		if(x%i==0){
			res++;
			if(x%(x/i)==0) res++;
		}
	}
	return res;
}
int d(int x){
	int mi=x;
	for(int i=2;i<=sqrt(x);i++){
		if(x%i==0&&i>2) mi=min(mi,i);
		if(x%(x/i)==0&&(x/i)>2){
			mi=min(mi,x/i);	
		}
	}
	return mi;
}
queue<int> Out;
void solve(int x){
	Out.push(x);
	if(x==1) return ;
	if(x==lowbit(x)){
		solve(x/2);
	}	
	else solve(x-lowbit(x));
}
int T;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>T;
	while(T--){
		int x;
		cin>>x;
		solve(x);
		cout<<Out.size()<<'\n';
		while(Out.size()>0) cout<<Out.front()<<' ',Out.pop();
		cout<<'\n';
	}

	return 0;
}
posted @ 2024-02-27 18:11  ChiFAN鸭  阅读(4)  评论(0编辑  收藏  举报