格雷码sol

格雷码
按题意二分模拟
注意要开unsigned long long

#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define SZ(x) ((int)x.size())
#define ALL(x) x.begin(),x.end()
#define U(i,u) for(register int i=head[u];i;i=nxt[i])
#define rep(i,a,b) for(register int i=(a);i<=(b);++i)
#define per(i,a,b) for(register int i=(a);i>=(b);--i)
using namespace std;
typedef long double ld;
typedef long long ll;
typedef unsigned int ui;
typedef pair<int,int> PII;
typedef vector<int> VI;
template<class T> inline void read(T &x){
	x=0;char c=getchar();int f=1;
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=f;
}
template<class T> inline void cmin(T &x, T y){x=x<y?x:y;}
template<class T> inline void cmax(T &x, T y){x=x>y?x:y;}
int n;
unsigned long long k;
unsigned long long inv[70];
inline void print(int a,unsigned long long rak){
	if(a==1){
		if(rak==0)printf("0");
		else if(rak==1)printf("1");
		return;
	}
	if(a==64){
		if(rak<inv[a-1]){
			printf("0");
			print(a-1,rak);
		}else{
			printf("1");
			unsigned long long tmp=inv[a-1]-rak-1;
			tmp+=inv[a-1];
			print(a-1,tmp);
		}
	}
	else{
		if(rak<inv[a-1]){
			printf("0");
			print(a-1,rak);
		}else{
			printf("1");
			print(a-1,inv[a]-rak-1);
		}
	}
}	
int main(){
	read(n);read(k);
	inv[0]=1;rep(i,1,n)inv[i]=inv[i-1]*2;
	print(n,k);
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/hangzz/p/13387421.html