格雷碼sol
阿新 • • 發佈:2020-07-27
格雷碼
按題意二分模擬
注意要開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; }