专栏文章

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

P7071题解参与者 11已保存评论 13

文章操作

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

当前评论
13 条
当前快照
1 份
快照标识符
@miqo1auv
此快照首次捕获于
2025/12/04 07:56
3 个月前
此快照最后确认于
2025/12/04 07:56
3 个月前
查看原文
  • 我们这样考虑,一个十进制整数必然可以化为二进制,也就是写成若干个 22非负整数次幂之和,如果这个数是奇数,那么它二进制的末尾必然是 11,也就是它的拆分中必然有一项 202^0,故无解。
  • 如果是偶数则它的二进制末位是 00,也就是必定能写成若干个 22正整数次幂之和,因此必然有解。我们可以先记录 10710^7 以内的 22 的正整数次幂,然后从大到小,将 nn 试着减去这些 22 的正整数次幂。(感性地理解一下,这样做是正确的。)然后输出答案即可。
我采用了递归的写法,相对比较直观。
CPP
#include<bits/stdc++.h>
using namespace std;
int n;
int p[40]={0,2,4,8,16,32,64,128,256,512,1024,2048,\
4096,8192,16384,32768,65536,131072,262144,524288,\
1048576,2097152,4194304,8388608,16777216,33554432,\
67108864,134217728,268435456,536870912,1073741824};
void f(int x){
	if(x==1||x==0) return;
	for(int i=30;i>=1;i--){
		if(x>=p[i]){
			cout<<p[i]<<" ";
			f(x-p[i]);
			break;
		}
	}
}
int main()
{
	cin>>n;
	if(n%2==1){
		cout<<-1<<endl;
		return 0;
	}
	else{
		f(n);
	}
} 

评论

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

正在加载评论...