题目描述
对称就是最大的美学,现有一道关于对称字符串的美学。已知:
- 第1个字符串:R
- 第2个字符串:BR
- 第3个字符串:RBBR
- 第4个字符串:BRRBRBBR
- 第5个字符串:RBBRBRRBBRRBRBBR
相信你已经发现规律了,没错!就是第 i 个字符串 = 第 i - 1 号字符串取反 + 第 i - 1 号字符串;
取反(R->B, B->R);
现在告诉你n和k,让你求得第n个字符串的第k个字符是多少。(k的编号从0开始)
输入描述
第一行输入一个T,表示有T组用例;
解析来输入T行,每行输入两个数字,表示n,k
- 1 ≤ T ≤ 100;
- 1 ≤ n ≤ 64;
- 0 ≤ k < 2^(n-1);
输出描述
输出T行表示答案;
输出 "blue" 表示字符是B;
输出 "red" 表示字符是R。
备注:输出字符串区分大小写,请注意输出小写字符串,不带双引号。
用例
输入 | 5 1 0 2 1 3 2 4 6 5 8 |
输出 | red red blue blue blue |
说明 | 第 1 个字符串:R -> 第 0 个字符为R 第 2 个字符串:BR -> 第 1 个字符为R 第 3 个字符串:RBBR -> 第 2 个字符为B 第 4 个字符串:BRRBRBBR -> 第 6 个字符为B 第 5 个字符串:RBBRBRRBBRRBRBBR -> 第 8 个字符为B |
输入 | 1 64 73709551616 |
输出 | red |
说明 | 无 |
问题解析
题目描述了一个递归生成字符串的规则:
- 第 1 个字符串:R
- 第 2 个字符串:BR
- 第 3 个字符串:RBBR
- 第 4 个字符串:BRRBRBBR
- 第 5 个字符串:RBBRBRRBRBBRBRBBR
可以发现,生成第 i
个字符串的方法是将第 i-1
个字符串取反(R 变 B,B 变 R),再拼接上第 i-1
个字符串。
给定 n
和 k
,需要求出第 n
个字符串的第 k
个字符。
输入描述
- 第一行输入一个整数
T
,表示有T
组用例。 - 对于每组用例,输入两个整数
n
和k
。
输出描述
输出 T
行答案,每行输出一个字符,表示第 n
个字符串的第 k
个字符。
解决思路
-
递归思路:
- 可以将问题分解为子问题。例如,第
n
个字符串的第k
个字符可以通过第n-1
个字符串求得。 - 如果
k
在前半部分,那么直接求第n-1
个字符串的第k
个字符。 - 如果
k
在后半部分,那么求第n-1
个字符串的第k - 2^(n-1)
个字符,然后取反。
- 可以将问题分解为子问题。例如,第
-
递归终止条件:
- 当
n == 1
时,返回R
。 - 当
n == 2
时,返回B
或R
,根据k
的值判断。
- 当
实现步骤
- 读入输入。
- 递归函数:根据上述递归思路实现函数
get_char(n, k)
。 - 输出结果。
C++ 实现
以下是实现该逻辑的 C++ 代码:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
char get_char(int n, long long k) {
if (n == 1) {
return 'R';
}
if (k < (1LL << (n - 1))) {
return get_char(n - 1, k);
} else {
char c = get_char(n - 1, k - (1LL << (n - 1)));
return c == 'R' ? 'B' : 'R';
}
}
int main() {
int T;
cin >> T;
vector<string> results;
for (int t = 0; t < T; ++t) {
int n;
long long k;
cin >> n >> k;
char result = get_char(n, k - 1); // k is 0-based index
results.push_back(result == 'R' ? "red" : "blue");
}
for (const string &res : results) {
cout << res << endl;
}
return 0;
}
代码说明
- get_char 函数:
- 递归求解第
n
个字符串的第k
个字符。 - 递归终止条件:
n == 1
时返回R
。 - 根据
k
的位置判断是取前半部分还是后半部分字符。
- 递归求解第
- 主函数:
- 读入输入的
T
组用例。 - 调用
get_char
函数计算结果,并转换为相应的字符串 "red" 或 "blue"。 - 输出结果。
- 读入输入的
示例输入输出
- 输入:
5
1 0
2 1
3 2
4 6
5 8
- 输出:
red
red
blue
blue
blue
该程序能够根据输入的 n
和 k
正确计算并输出第 n
个字符串的第 k
个字符。
Python 实现
def get_char(n, k):
if n == 1:
return 'R'
if k < (1 << (n - 1)):
return get_char(n - 1, k)
else:
c = get_char(n - 1, k - (1 << (n - 1)))
return 'B' if c == 'R' else 'R'
def main():
import sys
input = sys.stdin.read
data = input().split()
T = int(data[0])
index = 1
results = []
for _ in range(T):
n = int(data[index])
k = int(data[index + 1])
index += 2
result = get_char(n, k - 1) # k is 0-based index
results.append("red" if result == 'R' else "blue")
for res in results:
print(res)
if __name__ == "__main__":
main()
代码说明
- get_char 函数:
- 递归求解第
n
个字符串的第k
个字符。 - 递归终止条件:
n == 1
时返回R
。 - 根据
k
的位置判断是取前半部分还是后半部分字符。
- 递归求解第
- main 函数:
- 读取输入的
T
组用例。 - 调用
get_char
函数计算结果,并转换为相应的字符串 "red" 或 "blue"。 - 输出结果。
- 读取输入的
使用示例
运行程序时,将按照下述步骤操作:
- 输入测试用例数量
T
。 - 输入每组测试用例的
n
和k
。 - 程序将输出每组测试用例的结果。
示例输入:
5
1 0
2 1
3 2
4 6
5 8
示例输出:
red
red
blue
blue
blue
该程序能够根据输入的 n
和 k
正确计算并输出第 n
个字符串的第 k
个字符。