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();
}
}

浙公网安备 33010602011771号