题意:
对于给定的数字n,需要从二叉树中找到一条路径,使得路径上的编号 是+ 或者- 。 一直走m个点,使得和为n
思路:
对于给定的m个节点,我们从根一直向左走,最后一层 (第m层) 特判。
具体操作:
一直向左走, 假如数字为8 3 , 那么我们从1 -> 2 ->5 我们就可以得到pow(2,3) 为8 。但是如果不是8 是6 ,我们就可以改变1的正负号。当然如果是7呢。我们就可以使最后一层取得1-> 2 ->4 将路径指针左偏。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;
typedef long long ll;
ll ans[65];
int main (void) {
int T;
cin>>T;
int kase = 0;
while(T --) {
memset(ans, 0, sizeof ans);
ll n, m; cin>>n>>m;
ll p = pow(2, m) - n;
int f = 0;
if(p % 2) {
ll k = p - 1;
k /= 2;
int z = 0;
while(k) {
ans[++z] = k % 2;
k /= 2;
}
f = 1;
}
else {
ll k = p;
k /= 2;
int z = 0;
while(k) {
ans[++z] = k % 2;
k /= 2;
}
}
ll k = 1;
cout<<"Case #"<<++kase<<":"<<endl;
for(int i=1; i<m; ++i) {
cout<<k;
k *= 2;
if(ans[i]) cout<<" -"<<endl;
else cout<<" +"<<endl;
}
if(f == 0) {
cout<<k+1<<" +"<<endl;
}
else {
cout<<k<<" +"<<endl;
}
}
return 0;
}