专栏文章

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

P7071题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miqny678
此快照首次捕获于
2025/12/04 07:53
3 个月前
此快照最后确认于
2025/12/04 07:53
3 个月前
查看原文
遇到这种与 22 的次幂有关的题目,一个显然的思路是将所有数转化为二进制表示,这样可以很直观地发现一些性质。
本题即为一个很好的例子。我们把输入的 nn 转换为二进制表示,显然地,任意一个十进制数都可以用二进制表示。
对于一个二进制数,其十进制即为:对于每一个二进制上为 11 的数位,设其为从小到大第 ii 位,令 mim_i2i+12^{i+1},则 m\sum m 即为其十进制表示下的数。
由于 202^0 不能参与构造,那么二进制表示下 nn 的最低位也不能为 11,显然地,对于所有奇数,无法构造。对于所有偶数,可以构造,且为唯一解。
那么我们模仿上述思考的方法,从小到大依次枚举 nn 的二进制位,遇到 11 就加入数组中,最后倒序输出即可。
本题数据范围 1n1071 \le n \le 10^7,因此枚举 3030 位即可。
CPP
#include<iostream>
#include<cstdio>
using namespace std;
const int N=36;
int a[N];
int res=0;
int main(){
	int n;
	cin>>n;
	if(n&1){
		cout<<"-1";
		return 0;
	}
	int p=0;
	while(n>=1){
		if(n&1){
			a[++res]=(1<<p);
		}
		n>>=1;
		++p;
	}
	for(int i=res;i>=1;i--){
		cout<<a[i]<<" ";
	}
	return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...