格雷码

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;
    }

posted on 2020-10-12 15:04  fishsit  阅读(195)  评论(0编辑  收藏  举报

导航