題目描述:
QAQ…
題目分析:
我們直接分兩個情況討論,看一個第N個格雷碼第K個是從上個格雷碼正序+0還是逆序+1來的,然後不停的遞歸就行了,需要注意的是,我們默認的順序是順序,在第二個情況裏需要算出這個串在正序裏排多少
還有就是需要開unsigned long long
題目鏈接:
AC代碼:
#include <cstdio>
#include <iostream>
#include <algorithm>
#define ull unsigned long long
inline ull ksm(ull x,ull y)
{
ull ans=1ll;
while(y)
{
if(y&1) ans=(ull)(ans*x);
x=x*x;
y/=2ll;
}
return ans;
}
void dfs(ull n,ull k)
{
if(n==1)
{
if(k==0) printf("0");
else printf("1");
return;
}
ull s=ksm(2,n-1)-1;
//printf("%llu %llu\n",s,k);
if(k<=s)
{
printf("0");
dfs(n-1,k);
}
else
{
printf("1");
dfs(n-1,s-(k-s)+1);
}
}
inline ull read()
{
ull x=0;
char ch=0;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9')
x=x*10ll+1ll*(ch-'0'),ch=getchar();
//printf("%llu\n",x);
return x;
}
int main()
{
ull n,k;
n=read(),k=read();
dfs(n,k);
return 0;
}