题目链接:Binary Tree
题目大意:给你一个二叉树,编号就是二叉树的编号,然后从根节点到第k层的某一个结点,你可以以一些途径到达,然后经过的根节点编号需要加加减减,问你怎么凑出来这个n,特判数据
题目思路:我们注意到 N<2k ,所以我们可以想到,一定是能用 1,2,4′′′2k 去凑出来这个N,但是转化成二进制我们注意到,本来为0的数我们是需要减掉而不是不需要,所以,我们把为0的数贡献算出来,然后用它的一半去计算,这样就可以多减掉这部分来凑成最开始为0的贡献,然后奇数的时候把 2k−1 变成 2k 就好了,也是可以达到的,具体看代码
#include <map>
#include <set>
#include <cmath>
#include <stack>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int main(){
ll T,n,k;
bool flag;
scanf("%lld",&T);
for(ll Case = 1;Case <= T;Case++){
flag = false;
scanf("%lld%lld",&n,&k);
ll sum = (1<<k)-1;
ll ans = sum - n;
if(ans&1) ans++,flag = true;
ans /= 2;
ll i = 0;
ll a[105] = {0};
while(ans){
a[i++] = ans%2;
ans/=2;
}
printf("Case #%d:\n",Case);
for(ll j = 0;j < k-1;j++){
a[j] = (a[j]+1)%2;
if(a[j] == 0) printf("%d -\n",(1<<j));
else printf("%d +\n",(1<<j));
}
if(flag) printf("%d +\n",(1<<(k-1))+1);
else printf("%d +\n",(1<<(k-1)));
}
return 0;
}