本题的意思是,给你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;
}