2 3
10
3 5
111
44 1145141919810
00011000111111010000001001001000000001100011
若在當前個數的左邊(對於中間值而言),則當前位爲0(這一邊的上一位不是1)
若在當前個數的右邊(同上),則當前位爲1(同上)
若上一位爲1,則將上述規律調換一遍
#include<iostream>
#include<cstdio>
#define ull unsigned long long
int n;
ull k;
using namespace std;
int main()
{
ull l, r;
scanf("%d", &n);
cin >> k;
if (n == 64) {
return !printf("1000000000000000000000000000000000000000000000000000000000000000");//對數據的特判
}
else l = 1, r = 1ull << n;
bool pd = 0;
while (l < r)
{
ull mid =(ull) (l + r) >> 1;//取中間值
if (k < mid) {
r = mid;
if (pd == 1) printf("1"), pd = 0;
else printf("0");//同思路(pd判斷上一位是否爲1)
}
else {
l = mid + 1;
if (pd == 1) printf("0");
else printf("1");//同上
pd = 1;
}
}
}