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);
}