P1010 幂次方
分治的核心是找到每一步的可能结果,不管是正推还是逆推。
在这个题当中每一步都有两种可能
- 是2的幂次方
- 不是2的幂次方
第一种情况对应着2(solve())
的结构
第二种对应着寻找一个等比隔项求和式
先开始正因为没有定义清楚这个开头,所以导致了很多不必要的时间浪费
代码
#include <iostream>
using namespace std;
int a;
string res[20] = {"2(0)", "2"}, s = "2(", e = ")";
string solve(int k)
{
int b = 1, bit = 0, flag = 0;
while (b <= k)
b <<= 1, bit++;
b >>= 1, bit--;
if (k == b)//如果是2的次方
if (res[bit].size())
return res[bit];
else return res[bit] = s + solve(bit) + e;
string tmp;
while (k > 0)//如果不是。
{
if (flag)
tmp += "+";
k -= b;
tmp += solve(b);
flag = 1;
while (b > k)
b >>= 1, bit--;//注意这里是要进行多次位运算直到其小于原数。
}
return tmp;
}
int main()
{
cin >> a;
cout << solve(a);
}