本题的意思是,给你1/2,1/2,1,2,4……2^(k-1) ,让你在左边的数列中添加+号或者-号,使得最终的答案为n即可。
思路:
我们知道上面这些数直接如果全部都填+号的话,那么最终得到的数为2^k,而如果我们把其中的一个数如2^(j)前面的+号改成-号的话,那么结果将减少2*2^(j),我们从这个角度出发,考虑r = 2^(k) - n,也就是需要把和为r/2的数前面的+变成-。那么我们只需要把(r/2)的二进制表示中为1的位对应的出现在数列中的数前面的+改成-就好了。
代码实现:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define int long long
int ops[66];
main(){
int T;scanf("%lld",&T);
while(T--){
memset(ops,0,sizeof(ops));
int n,k;
cin>>k>>n;
int r = ((int)1<<k) - n;
int cnt = 1;
while(r){
if(r&1){
ops[cnt] = 1;
}
r >>= 1;
cnt++;
}
for(int i = 1 ;i <= k+1;i++){
if(i != 1){
cout<<' ';
}
if(ops[i]){
cout<<'-';
}
else{
cout<<'+';
}
}
cout<<endl;
}
return 0;
}