题目描述
任何一个正整数都可以用 22 的幂次方表示。例如
137=2^7+2^3+2^0137=27+23+20
同时约定方次用括号来表示,即 a^bab 可表示为 a(b)a(b) 。
由此可知, 137137 可表示为:
2(7)+2(3)+2(0)2(7)+2(3)+2(0)
进一步:
7= 2^2+2+2^07=22+2+20(2^1用2表示),并且
3=2+2^03=2+20
所以最后 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=2^{10} +2^8 +2^5 +2+11315=210+28+25+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)
输入输出格式
输入格式:
一个正整数 n(n≤20000)n(n≤20000)
输出格式:
符合约定的 nn 的 0,2 表示(在表示中不能有空格)
输入输出样例
输入样例#1:
1315
输出样例#1:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
解法:分治、递归
又是一个分治题。把原问题分解为规模较小形式相同的问题。
最小规模为2、1、0则直接输出2(1)、2、2(0)
对于一个数首先求其二进制,如果它只有最高位为1,那么一定可以分解为2(....)的幂的形式
那么则递归处理对应的位
否则就直接处理对应2进制数的数。(注意这两者的区别!)
举个栗子:对于数7,二进制为111,则需要处理的是4 2 1
而对于数8,其二进制为1000,则先输出"2(" 再递归处理4,最后处理完后输出')'
可以用bitset进行二进制的处理。(真香)
#include <bits/stdc++.h>
#define pii pair<int, int>
#define ll long long
using namespace std;
const int maxn = 1e6 + 10;
void solve(int n)
{
if(n == 1)
{
cout << "2(0)";
return;
}
if(n == 2)
{
cout << "2";
return;
}
if(n == 4)
{
cout << "2(2)";
return;
}
bitset<20> b(n);
int cnt = (int)b.count();
if(cnt == 1)
{
cout << "2(";
for(int i = 15; i >= 0; i--)
{
if(b[i])
{
cnt--;
solve(i);
if(cnt)
cout << "+";
}
}
cout <<")";
}
else{
for(int i = 15; i >= 0; i--)
{
if(b[i])
{
cnt--;
solve(1 << i);
if(cnt)
cout << "+";
}
}
}
}
int main()
{
// freopen("/Users/vector/Desktop/testdata.in", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
solve(n);
return 0;
}