题解:CF2074C XOR and Triangle
CF2074C XOR and Triangle
二分做法
根据异或的规律我们不难发现,一个数异或它的一半的结果大于这个数本身,异或它的四分之一的结果会比刚才的小。
具体的证明本蒻给不出(悲)。
AC Code
#include<bits/stdc++.h>
#define ll long long
const int N = 1e5 + 10;
using namespace std;
ll n;
int main(){
ios::sync_with_stdio(0);
int T;
cin>>T;
while (T--) {
cin>>n;
if (n == 2){
cout<<"-1"<<'\n';continue;
}
ll l = 1,r = n;
bool ok = true;
while (l < r) {
ll mid = (l+r)>>1;
ll p = mid ^ n;
if(p+mid > n && p+n > mid && mid+n > p) {
cout<<mid<<endl;ok=false;ok1=false;break;
}else {
l = mid + 1; //单方向二分就可以了,这里是向上,下面有向下的。
}
}
/* 第二种二分办法
if(ok1){
while (l < r) {
ll mid = (l+r)>>1;
ll p = mid ^ n2;
if(p+mid > n && p+n > mid && mid+n > p) {
cout<<mid<<endl;ok=false;break;
}else {
r = mid;
}
}
}
*/
if(ok) cout<<"-1"<<'\n';
}
return 0;
}