题目信息
![在这里插入图片描述](https://img-blog.csdnimg.cn/c3b4798003794f2cb80af53c1d8e1f62.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_Q1NETiBA6JKf6JK75LiA5p6a,size_27,color_FFFFFF,t_70,g_se,x_16)
解题思路
- O(n)递推算出每个字符串的长度,判断k是否合法。
- 利用长度找规律,O(n)时间求出答案。
代码实现
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const string s1 = " words";
const string s2 = " Listeningtoyour";
const string s3 = " likelisteningtothe";
ll l[105];
char get(ll n, ll k) {
if (n == 0) {
return s1[k];
}
if (k <= 15) {
return s2[k];
}
if (k <= 15 + l[n - 1]) {
return get(n - 1, k - 15);
}
if (k <= 33 + l[n - 1]) {
return s3[k - l[n - 1] - 15];
}
return get(n - 1, k - l[n - 1] - 33);
}
int main() {
ios :: sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
l[0] = 5;
for (int i = 1; i <= 100; ++i) {
l[i] = 33 + 2 * l[i - 1];
if (l[i] > 1e18) {
l[i] = 1e18;
}
}
int T;
cin >> T;
while (T--) {
ll n, k;
cin >> n >> k;
if (l[n] < k) {
cout << "*\n";
} else {
cout << get(n, k) << '\n';
}
}
return 0;
}