在第一行我们写上一个0。接下来的每一行,将前一行中的0替换为01,1替换为10。 给定行数N和序数K,返回第N行中第K个字符。(K从1开始)
输入格式:
输入在一行中给出2个整数N和K。 N的范围[1,30] K的范围[1,2(N−1)]
输出格式:
对每一组输入,在一行中输出第N行中第K个字符。
输入样例1:
1 1
结尾无空行
输出样例1:
0
结尾无空行
输入样例2:
2 1
结尾无空行
输出样例2:
0
结尾无空行
输入样例3:
2 2
结尾无空行
输出样例3:
1
结尾无空行
输入样例4:
4 5
结尾无空行
输出样例4:
1
结尾无空行
Hint:
第一行: 0
第二行: 01
第三行: 0110
第四行: 01101001
解题报告:
思路1:找规律,发现:下一行=上一行+上一行按位取反
思路2:分治,按照线段树的思路递归到第n层就好了。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
const int MAX = 2e6 + 6;
using namespace std;int n, K;
char ans;
void dfs(int dep, int k, string cur) {if(dep == n) {ans = cur[k-1];return ;}int fen = 1<<(n-dep-1);if(k > fen) dfs(dep+1, k-fen ,cur == "01"?"10":"01");else dfs(dep+1, k, cur=="01"?"01":"10");
}
int main()
{cin>>n>>K;dfs(1, K, "01");cout << ans << endl;return 0;
}