[NOIP/CSP 2019提高組] 格雷碼

題目描述:

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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章