二进制
"优秀的拆分"如果存在,则代表 $n$ 的二进制最低位不是 $1$.
$\because 2^0 = 1$
$\therefore$ 当 $n$ 的二进制最低位为 $1$ 时,不存在优秀的拆分.
即 $n$ 不是奇数.
上述条件判断完后,就可以从 $2$ 的 $30$ 次方开始模拟( int 的上限是 $2^{31}-1$).
代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n;
int main() {
scanf("%d", &n);
if (n % 2 == 1) printf("-1"); // n 为奇数不存在优秀的拆分
else {
int p = 30;
while (n) { // 从 2^30 开始枚举
int power = pow(2, p);
if (power <= n) { // n 能够减去 power
printf("%d ",power);
n -= power;
}
p--; // 次数降低
}
}
return 0;
}
标签:int,题解,优秀,30,二进制,拆分,include,P7071,CSP
From: https://www.cnblogs.com/panda-lyl/p/18498503