CF743B Chloe and the sequence 题解 递归

题目链接: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;
}
原文地址:https://www.cnblogs.com/quanjun/p/12206352.html