链接:http://acm.hdu.edu.cn/showproblem.php?pid=5573
思路:首先,我们要知道,用1,2,4,...2^(n-1)能构造出所有的1~2^n-1的数,所以我们一直走最左边的路就好了,当然,根据奇偶性要在最后一步调整下.
然后我们在第i层选正负怎么办呢,我们就假设是正的,那么我们就要用1,2...2^(i-1)构造出n-2^i,如果构造不出来,那就取负的。循环这一过程就好了。
代码:
#include <bits/stdc++.h>
#define fur(i,a,b) for(int i=(a);i<=(b);i++)
#define furr(i,a,b) for(int i=(a);i>=(b);i--)
#define cl(a) memset((a),0,sizeof(a))
using namespace std;
typedef long long ll;
// (づ°ω°)づe★-------------------------------------------------
ll n,k;
stack<ll>val;
void solve(){
ll now = 1<<(k-1);
if(!(n&1)) now++;
furr(i,k-1,0){
ll tmp = abs(n-now);
if( tmp>=0 && tmp<=( (1<<i)-1 ) ){
n-=now;
val.push(now);
}else{
n+=now;
val.push(-now);
}
now>>=1;
}
}
int main(){
int T;
cin>>T;
fur(kase,1,T){
printf("Case #%d:\n",kase);
cin>>n>>k;
solve();
while(!val.empty()){
ll v = val.top();
val.pop();
printf("%lld %c\n",abs(v),v>0?'+':'-');
}
}
return 0;
}