题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5573
题目大意:给定二叉树(无限大)按顺序编号,青蛙可以沿着二叉树走k层,开始时为0,每层可以加上或减去该数字,求一种方案使得最终结果为N。
任意一个2^k以内的奇数可以由k个2的n次幂相加减构成,如k=3时5 = 2 ^ 2+ 2 ^ 1 - 2 ^ 0 , 3 = 2 ^ 2 - 2 ^ 1 + 2 ^ 0 。
如果是偶数,青蛙可以选择在最后一层(第k层)向右节点上移动,即对应的奇数+1。
code:
#include<cstdio>
using namespace std;
typedef long long ll;
ll n,k;
void solve(ll i,ll num)
{
if(num==0) return;
ll temp=(ll)(1<<(num-1));
if(n>=i)
{
solve(i+temp,num-1);
printf("%lld +\n",temp);
}
else
{
solve(i-temp,num-1);
printf("%lld -\n",temp);
}
}
int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&n,&k);
printf("Case #%d:\n",cas++);
ll temp=(ll)(1<<(k-1));
if(n&1)
{
solve(temp,k-1);
printf("%lld +\n",temp);
}
else
{
n--;
solve(temp,k-1);
printf("%lld +\n",temp+1);
}
}
return 0;
}