http://acm.hdu.edu.cn/showproblem.php?pid=5573
Binary TreeTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2018 Accepted Submission(s): 1206 Special Judge Problem Description The Old Frog King lives on the root of an infinite tree. According to the law, each node should connect to exactly two nodes on the next level, forming a full binary tree. Input First line contains an integer T , which indicates the number of test cases. Output For every test case, you should output "Case #x:" first, where x indicates the case number and counts from 1 . Sample Input 2 5 3 10 4 Sample Output Case #1: 1 + 3 - 7 + Case #2: 1 + 3 + 6 - 12 + |
#include<bits/stdc++.h>
using namespace std;
long long n,k;
int flag = 0;
int a[666];
int main()
{
//只走二叉树的最左边那个道路,
int t;
scanf("%d",&t);
for(int cases=1; cases<=t; cases++)
{
scanf("%lld%lld",&n,&k);
flag = 0;
memset(a,0,sizeof(a));
if(n%2==0)
{
flag = 1;
n = n-1;//偶数的情况,把它变成奇数;
}
int tmp = 0;
for(int i=k-1; i>=0; i--)
{//找规律,看哪些需要+,哪些需要减;
a[i]=1-tmp;
tmp=1;
if((n>>i)&1)
tmp=0;
//cout<<(n>>i)<<"dfsd"<<((n>>i)&1)<<endl;
}//
printf("Case #%d:\n",cases);
long long now = 1;
for(int i=0; i<k-1; i++)
{
printf("%lld ",now);
now = now*2;//只输出2的n次方;
if(a[i])printf("+\n");
else printf("-\n");//
}
if(flag)printf("%lld ",now+1);
else printf("%lld ",now);//如果是偶数,那么往右拐一下;
if(a[k-1])printf("+\n");
else printf("-\n");
}
}