000,001,011,010,110,111,101,100
你会发现:
前一半是0打头,后一半是1打头
前一半顺序,后一半逆序
去掉首位,后面同理
改变顺序(逆序)只会影响后一位
所以只需要:
打个表
判断位置
注意顺序
开long long 不见祖宗
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn =1e6+7;
#define scy(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
inline unsigned long long read() {
unsigned long long x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int main(){
scy("in");
unsigned long long n,k,m;
bool v;//v是影响标记
unsigned long long a[65];
n=read(),k=read();
m=n;
a[0]=1;
for(int i=1;i<=64;i++) a[i]=a[i-1]+a[i-1];//打表
for(int i=1;i<=n;i++)
{
m--;
if(k<a[m])//在前面
{
printf("%d",v);
v=0;
}
else //在后面
{
if(v) printf("0");
else
{
printf("1");
v=1;
}
k-=a[m];
}
}
return 0;
}