小 S 的 ARC191 参赛记-2
前序:小 S 的 ARC191 参赛记-1(即 ARC191A 题解)
切掉了 A 后,小 S 十分愉快地开了 B。
大致题意
给定
小 S 看到这道题也是十分兴奋啊,想了一下立马口胡了个结论:
- 当
x<n 或x 二进制下的最高位高于n 二进制下的最高位时,没有一个x 满足条件。
因为这是题解不是赛时,所以小 S 还是要证一下的。
首先,
其次,如果
那么,因为
那也就是说,如果
小 S 高兴的不得了,因为他发现,这意味着
至于如何计算第
于是小 S 愉快地无伤通过了此题,真是与 ARC189B 的 -10 截然不同的结局啊。
也许,这就是小 S 每天殷切地对着卫星许愿的原因吧。
S.A.T.E.L.L.I.T.E.
(但是小 S 还是被 C 的神秘结论创飞了)
Code
#include<algorithm>
#include<bitset>
#include<deque>
#include<iomanip>
#include<iostream>
#include<iterator>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<utility>
#include<vector>
#include<chrono>
#include<random>
#include<tuple>
#include<unordered_map>
using namespace std;
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define debug1(x) cerr<<#x<<"="<<x<<" "
#define debug2(x) cerr<<#x<<"="<<x<<"\n"
const int inf=1e16,maxn=1e6+10;
namespace ARIS2_0{
void solve(){
int n,k;cin>>n>>k;
vector<int>v;
for(int i=0;(1ll<<i)<=n;i++){
if(!((n>>i)&1))v.push_back(i);
}
if(k>(1ll<<(v.size()))){
cout<<"-1\n";
return;
}
int ans=n;
k--;
for(int i=0;i<v.size();i++){
if((k>>i)&1){
k-=(1ll<<i);
ans+=(1ll<<(v[i]));
}
}
cout<<ans<<"\n";
}
}
signed main(){
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
int t;cin>>t;
while(t--)ARIS2_0::solve();
return 0;
}
/*
clang++ -std=c++14 -Wall -Wextra -Wshadow -Wconversion -Wl,-stack_size -Wl,512000000
*/