大致题意:
- 任何一个正整数都可以用2的幂次方表示,
- 同时约定次方用括号来表示,
- 并且把每一个指数都写成2的幂次方。
基本思路:
- 深搜大气!深搜威武!深搜
我爱你牛逼!
- 咳咳,不中二了。
- dfs(m)解决的就是m表示的2的幂次方。
- 然后一层层套到最后就ok啦。
Code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
using namespace std;
#define R read()
#define GC getchar()
#define ll long long
#define ull unsigned long long
#define INF 0x7fffffff
#define LLINF 0x7fffffffffffffff
ll read(){
ll s=0,f=1;
char c=GC;
while(c<'0'||c>'9'){if(c=='-')f=-f;c=GC;}
while(c>='0'&&c<='9'){s=s*10+c-'0';c=GC;}
return s*f;
}
int n;
void dfs(int m){
for(int i=14;i>=0;--i){//因为2^15大于n的最大数据,所以从14开始。至于为什么从大到小,因为根据题目描述都是从大的开始加的……
int t=pow(2.0,i);//求出2^i次方(至于为什么要写成浮点数,因为写整数vscode会报错……
if(t<=m){//如果可以剪掉
if(i==0){//2^0就是2(0)
printf("2(0)");
}else if(i==1){//2^1就是2
printf("2");
}else{//因为2^i(i≠0,i≠1)的i需要拆分,直接套下去就好了
printf("2(");
dfs(i);
printf(")");
}
m-=t;//减去ta
if(m!=0){//如果等于0就说明已经弄完了,不用输出'+'了,不等于0就需要输出'+'
printf("+");
}
}
}
}
int main(){
n=R;
dfs(n);
return 0;
}