T1:优秀的拆分
首先排除所有奇数,然后考虑如果这个数大于 2 2 2的 k k k次方,那就从 2 k 2 2^k\text{~}2 2k 2 一直减下去,如果出现了 0 0 0那么就成功,否则失败
#include <bits/stdc++.h>
int s[] = {
0,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,1048576*2,1048576*2*2,1048576*2*2*2,1048576*2*2*2*2,1048576*2*2*2*2*2};
int vis[20], mx;
int q;
using namespace std;
int main() {
cin >> q;
if(q % 2) {
cout << -1;
return 0;
}
for(int i = 0; i < sizeof(s)/sizeof(int); i ++) {
if(q < s[i]) {
mx = i;
break;
}
}
for(int i = mx; i > 0 && q; i --) {
if(q >= s[i]) {
cout << s[i] << ' ';
q -= s[