P7071 [CSP-J2020] 优秀的拆分 题解

panda-lyl / 2024-11-13 / 原文

二进制

"优秀的拆分"如果存在,则代表 \(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;
}