题目链接: https://ac.nowcoder.com/acm/contest/890/B
这道题,原本没什么思路,但听队友一提类似斐波那契数列,emmmmm,我看了一篇博客(也是关于斐波那契字符串的题目),突然就知道怎么写了(博客:https://blog.csdn.net/weixin_44405344/article/details/88379483)
思路
第n个字符串,它的前一半是第n - 2 个字符串, 后一半是第n - 1个字符串,而我们要找的是[k, k + 9] 这一段字符串, 所以我们知道有三种情况 :
- 这段字符串全在第n-2个字符串中
- 这段字符串全在第n-1个字符串中
- 一部分在第n-2个字符串中,反之另一部分在n-1中]
所以我们可以递归一直往前推,最终从第一个,第二个字符串中找到我们要找的字符串
代码
#include <bits/stdc++.h>
using namespace std;
string s[50];
long long len[100];
void init()
{
s[1] = "COFFEE";
s[2] = "CHICKEN";
//预处理好1-57, 字符串的长度
len[1] = 6;
len[2] = 7;
for(int i = 3; i <= 57; i++){
len[i] = len[i - 1] + len[i - 2];
}
}
void f(int n, long long l, long long r)
{
if(n <= 2){
cout << s[n].substr(l - 1, (r - l + 1));
return ;
}
if(len[n - 2] > r){
f(n - 2, l, r);
}
else if(len[n - 2] < l){
f(n - 1, l - len[n - 2], r - len[n - 2]);
}
else{
f(n - 2, l, len[n - 2]);
f(n - 1, 1, r - len[n - 2]);
}
}
int main()
{
ios::sync_with_stdio(false);
init();
int n;
while(cin >> n){
int m;
long long k;
for(int i = 1; i <= n; i++){
cin >> m >> k;
if(m >= 56){
// 大于等于56时, k == 1e12
//奇数项和偶数项开头不一样
if(m % 2) m = 57;
else m = 56;
}
f(m, k, k + 9);
cout << endl;
}
}
return 0;
}