题目链接:http://codeforces.com/problemset/problem/743/B
题目描述
灵灵最近发明了一个序列,他称他的序列为 (n-)序列。
对于一个 (n-)序列,如果 (n=0) ,那么它是一个空的序列(也就是说空序列中没有元素)。
然后他会进行 (i) 次操作,每次操作,他会在原序列末尾添加一次原序列,并且在两个原序列之间插入一个值为 (i) 的元素。
比如:
当 (n = 0) 时,(0-) 序列为 ([]);
当 (n = 1) 时,(1-) 序列为 ([] + 1 + [] = [ 1 ]);
当 (n = 2) 时,(2-) 序列为 ([ 1 ] + 2 + [ 1 ] = [ 1, 2, 1 ]);
当 (n = 3) 时,(3-) 序列为 ([ 1, 2, 1 ] + 3 + [ 1, 2, 1 ] = [ 1, 2, 1, 3, 1, 2, 1 ]),
…………
现在我们的题目要求,给你一个 (n-) 序列,求出它的第 (k) 个元素。
比如,(3-) 序列 的 第 (2) 个元素是 (2) 。
输入格式
输入包含两个整数 (n) 和 (k) ( (1 le n le 50, 1 le k lt 2^n) )。
输出格式
输出 (n-) 序列 中的第 (k) 个元素的值。
样例输入1
3 2
样例输出1
2
样例输入2
4 8
样例输出2
4
样例解释
对于样例1,一个 (3-) 序列 ([1, 2, 1, 3, 1, 2, 1]) 的第 (2) 个元素是 (2) ;
对于样例2,一个 (4-) 序列 ([1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1]) 的第 (8) 个元素是 (4) 。
样例分析
这道题目是一道非常经典的递归的题目。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 51;
int n, ans;
long long k, f[maxn];
void init() {
f[1] = 1;
for (int i = 1; i < maxn; i ++) f[i] = f[i-1] * 2 + 1;
}
void solve(int n, long long k) {
if (k == f[n-1] + 1) ans = n;
else if (k <= f[n-1]) solve(n-1, k);
else solve(n-1, k - f[n-1] - 1);
}
int main() {
init();
cin >> n >> k;
solve(n, k);
cout << ans << endl;
return 0;
}