[CSP-J2020 T1] 优秀的拆分
本题目考察的是二进制以及位运算。按照优秀的拆分定义,奇数的末尾一定是1,1就是2的零次方,所以只要奇数一定不存在优秀的拆分。
相反偶数一定存在优秀的拆分。
从二进制角度看即可。2的10次方是1024 大约是10的3次方;2的20次方是大约是10的6次方左右。本题n的最大取值是10的7次方。10的6次方乘以8或者16就约定于10的7次方了。所以n的位数一定在24位左右。用pow函数输出一下试试。2的24次方大于10的7次方。所以代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
bool flag = true;
int n;
cin >> n;
if (n % 2 || n <= 0)
cout << -1 << endl;
else
{
for (int i = 24; i >= 1; i--)
{
if (n & (1 << i))
{
int p = pow(2, i);
if (flag)
{
flag = false;
cout << p;
}
else
cout << ' ' << p;
}
}
cout << endl;
}
return 0;
}