前言
请勿抄袭。
思路
二进制操作题。
首先,根据题意,如果给定的
n
n
n 是奇数那么直接输出 -1
。
然后,可以发现题目是要求我们把 n n n 拆成 2 a 1 + 2 a 2 + . . . 2 a x 2^{a_1}+2^{a_2}+...2^{a_x} 2a1+2a2+...2ax 这种形式。
看到这个,你会想到什么?是不是特别像二进制转十进制的计算方式?
先我们来看看二进制转十进制是怎样转换的:
( 101101 ) 2 = 2 0 + 2 2 + 2 3 + 2 5 = 45 (101101)_2 = 2^0+2^2+2^3+2^5=45 (101101)2=20+22+23+25=45
看看,是不是特别像?
也就是说我们从大到小找到 n n n 的二进制为 1 1 1 的位,并输出单独那一位对应的十进制不就行了?
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
signed main(){
ios::sync_with_stdio(0);
cin>>n;
if(n&1)cout<<-1;
else{
for(int i=32;i>=1;i--){
if(n&(1<<i)){
cout<<(1<<i)<<' ';
}
}
}
return 0;
}