[CSP-S 2019]格雷碼


[CSP-S 2019]格雷碼

題目大意:

格雷碼(Gray Code)是一種特殊的 \(n\) 位二進制串排列法,它要求相鄰的兩個二進制串間恰好有一位不同,特別地,第一個串與最后一個串也算作相鄰。

\(n\) 位格雷碼不止一種,下面給出其中一種格雷碼的生成算法:

  1. \(1\) 位格雷碼由兩個 \(1\) 位二進制串組成,順序為:\(0\)\(1\)
  2. \(n+1\) 位格雷碼的前 \(2^n\) 個二進制串,可以由依此算法生成的 \(n\) 位格雷碼(總共 \(2^n\)\(n\) 位二進制串)按順序排列,再在每個串前加一個前綴 \(0\) 構成。
  3. \(n+1\) 位格雷碼的后 \(2^n\) 個二進制串,可以由依此算法生成的 \(n\) 位格雷碼(總共 \(2^n\)\(n\) 位二進制串)按逆序排列,再在每個串前加一個前綴 \(1\) 構成。

綜上,\(n + 1\) 位格雷碼,由 \(n\) 位格雷碼的 \(2^n\) 個二進制串按順序排列再加前綴 \(0\),和按逆序排列再加前綴 \(1\) 構成,共 \(2^{n+1}\) 個二進制串。另外,對於 \(n\) 位格雷碼中的 \(2^n\) 個 二進制串,我們按上述算法得到的排列順序將它們從 \(0 \sim 2^n - 1\) 編號。

現在給出 \(n\)\(k\),請你求出按上述算法生成的 \(n\) 位格雷碼中的 \(k\) 號二進制串。

\(1\le n\le 64, 0<k<2^n\)

思路:

\(n-1\)\(0\)確定每一位。若\(k\)的當前位為\(1\),則對應的格雷碼該位也為\(1\),並將\(k\)剩下未處理的位取反;若\(k\)的當前位為\(1\),則對應的各類嗎改為也為\(0\),不取反。

源代碼:

#include<cstdio>
#include<cctype>
typedef unsigned long long uint64;
inline uint64 getint() {
	register char ch;
	while(!isdigit(ch=getchar()));
	register uint64 x=ch^'0';
	while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
	return x;
}
int main() {
	freopen("code.in","r",stdin);
	freopen("code.out","w",stdout);
	const int n=getint();
	uint64 k=getint();
	for(register int i=n-1;i>=0;i--) {
		const bool cur=(k>>i)&1;
		putchar(cur?'1':'0');
		if(cur) k=~k;
	}
	puts("");
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM