[CSP-J2020 T1] 优秀的拆分

作者: qiqi 分类: CSP-J 发布时间: 2025-10-06 12:16

查看题目

本题目考察的是二进制以及位运算。按照优秀的拆分定义,奇数的末尾一定是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;
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

标签云