Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2) C. Divisor Chain

C. Divisor Chain


原题链接


题意:一个数减去能整除它的因子,这个因子出现次数不超过两次


思路:可以尝试往二进制方向思考,注意到一个二进制数的最低位的 1 一定是它的因子,如x=10(10102) ,将x的最低位1一个个消去,变成(10002),再不断减去它的一半,直至为1


#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
typedef long long ll;
ll a[N];
void solve()
{
	ll x;
	cin>>x;
	int k=0;
	a[++k]=x;
	for(int i=0;i<=31;i++)
	{
		if(x>>i&1)
		{
			x-=(1<<i);//消去最低位
			a[++k]=x;
		}
	}
	k--;
	while(a[k]>1)
	{
		a[k+1]=(a[k]>>1);//÷2
		k++;
	}
	cout<<k<<'\n';
	for(int i=1;i<=k;i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<'\n';
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
}
posted @ 2023-08-31 22:57  无上大宗师  阅读(23)  评论(0)    收藏  举报