题意:给出一颗二叉树,根节点为1,子节点为父节点的2倍和2倍+1,从根节点开始依次向下走k层,问如何走能使得将路径上的数进行加减最终结果得到n。
思路:来自:点击打开链接
做题一定要注意数据范围! n <= 2^k啊!
是真的没想到利用差值去搞事情。。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int T, kase = 1;
ll n, k;
cin >> T;
while(T--)
{
cin >> n >> k;
bool flag = 0;
ll all = (1ll << k) - 1, delta;
delta = all - n;
if(delta & 1){
delta++;//这里相当于多减去了1,要在最后一层加回来
flag = 1;
}
delta >>= 1;
printf("Case #%d: \n", kase++);
for(int i = 0; i < k - 1; i++){
if(delta >> i & 1) printf("%lld -\n", 1ll << i);
else printf("%lld +\n", 1ll << i);
}
if(flag) printf("%lld +\n", (1ll << (k - 1)) + 1);
else printf("%lld +\n", 1ll << (k - 1));
}
}