洛谷笔记 - P1010 [NOIP1998 普及组] 幂次方

题目描述

任何一个正整数都可以用 22 的幂次方表示。例如

同时约定方次用括号来表示,即 aba^b 可表示为 a(b)a(b)

由此可知,137137 可表示为 2(7)+2(3)+2(0)2(7)+2(3)+2(0)

进一步:

7=22+2+207= 2^2+2+2^0 ( 212^122 表示),并且 3=2+203=2+2^0

所以最后 137137 可表示为 2(2(2)+2+2(0))+2(2+2(0))+2(0)2(2(2)+2+2(0))+2(2+2(0))+2(0)

又如 1315=210+28+25+2+11315=2^{10} +2^8 +2^5 +2+1

所以 13151315 最后可表示为 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入格式

一行一个正整数 nn

输出格式

符合约定的 nn0,20, 2 表示(在表示中不能有空格)。

样例 #1

样例输入 #1

1
1315

样例输出 #1

1
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

提示

【数据范围】

对于 100%100\% 的数据,1n2×1041 \le n \le 2 \times {10}^4

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//P1010 [NOIP1998 普及组] 幂次方
//https://www.luogu.com.cn/problem/P1010

//https://www.luogu.com.cn/record/84433400

#include<iostream>
#include<cmath>
using namespace std;
void loop(int a){
for(int i=14;i>=0;i--){ //从最大的平方值开整
if(pow(2,i)<=a){ //找到最大平方值
if(i==1) cout<<"2";
else if(i==0) cout<<"2(0)"; //特殊处理
else{
cout<<"2(";
loop(i); // 在新的"2()"中重找幂,范围大幅度缩小
/*
1315=2^10+2^8+2^5+2^2+2^0
//a=10 2^(10)
a=3 2^(2^(2+1)+2)
//a=8 2^(8)
a=3 2^(2^(2+1))
//a=5 2^5
a=5 2^(2^(2)+1)
//a=2 2^(1)
//a=0 2^(0)
*/
cout<<")";
}
a-=pow(2,i); //除去已求数值
if(a){ //通过数值有无判断是否继续后附"+"号
cout<<"+";
}
}
}
}
int main(){
int a;
cin>>a;
loop(a);
cout<<endl;
return 0;
}

参考

《题解 P1010 【幂次方】》——_xcc_ 的博客