目录
题面:
数据超大,但代码并不复杂,来看看思路吧!
思路:
很显然,这里需要一个dfs函数,我们设其为graycode。
把长度len和位置x_th存入graycode
如果长度为1,说明运算到了1位格雷码,输出x_th&1,结束程序。
否则,判断他在前半部分还是后半部分,如果在前半部分1,输出前缀1,把x_th设为2^len - 1 - x_th并把len--,递归调用函数。
如果在后半部分,输出前缀0,把len--,递归调用函数。
非常简洁的代码,但是注意,unsigned long long最大值为2^64 - 1而非2^64,所以在把x_th设为2^len - 1 - x_th时,要把2^len拆分成两个2^(len - 1)。
代码:
#include<iostream>
using namespace std;
#define ll unsigned long long
ll len,x_th;
void graycode(ll lens,ll x_ths)
{
if(lens == 1)
{
cout << (x_ths & 1ull);
return;
}
if(x_ths > (1ull << (lens - 1ull)) - 1ull)
{
putchar('1');
return graycode(lens - 1ull,(1ull << (lens - 1)) - 1ull - x_ths + (1ull << (lens - 1)));
}
else
{
putchar('0');
return graycode(lens - 1ull,x_ths);
}
}
int main()
{
cin >> len >> x_th;
graycode(len,x_th);
}