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

Content

给定一个数 \(n\),求是否能够拆分成 \(2\) 的正整数次幂的和的形式,并给出具体方案。

数据范围:\(1\leqslant n\leqslant 10^7\)

Solution

我们很容易想到,如果是奇数的话,肯定分解到最后会有个奇数,而它肯定不是 \(2\) 的正整数次幂的形式,此时没有方案,否则拿 \(2\) 的次幂一个一个去暴力减即可。具体可以打一个 \(2\) 的正整数次幂的表(到 \(10^7\) 以内即可),然后从大往小去暴力减。

Code

考场代码。

int num[] = {0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608};
int n, ans[37];

int main() {
	n = Rint;
	if(n % 2) return printf("-1"), 0;
	while(n > 0) {
		R(i, 23, 1) if(n >= num[i]) {n -= num[i], ans[++ans[0]] = num[i]; break;}
	}
	if(n < 0) printf("-1");
	else F(i, 1, ans[0]) {
		printf("%d", ans[i]);
		if(i != ans[0]) putchar(' ');
	}
}
posted @ 2021-12-16 14:58  Eason_AC  阅读(112)  评论(0)    收藏  举报