题意:给出字符串
S
1
,
S
2
S_1,S_2
S1,S2且
S
n
=
S
n
−
2
+
S
n
−
1
S_n = S_n-2 + S_n-1
Sn=Sn−2+Sn−1,求第
n
n
n个字符串从第
k
k
k位开始的后10个字符串。其中
n
<
=
500
,
k
<
m
i
n
(
∣
s
∣
,
1
0
12
)
)
n <= 500, k < min( |s|, 10^{12}))
n<=500,k<min(∣s∣,1012))
思路:递归搜索,分为三种情况,最后在左区间,最后在右区间,最后在左右区间都有。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5 + 5;
const ll INF = 1e12;
ll f[100], n, k, t, cnt;
string s1 = "COFFEE";
string s2 = "CHICKEN";
void dfs(int rund, ll l, ll r) {
if(rund == 1) {
for(int i = l; i <= min(6ll, r); i++)
putchar(s1[i - 1]);
return;
}
if(rund == 2) {
for(int i = l; i <= min(7ll, r); i++)
putchar(s2[i - 1]);
return;
}
if(f[rund - 2] > r) {//左
dfs(rund - 2, l, r);
return;
}
if(l > f[rund - 2]) {//右
dfs(rund - 1, l - f[rund - 2], r - f[rund - 2]);
return;
}
//左右都有,先递归打印左边保持顺序。
dfs(rund - 2, l, f[rund - 2]);
dfs(rund - 1, 1, r - f[rund - 2]);
}
int main() {
f[1] = 6, f[2] = 7;
for(cnt = 3;; cnt++) {
f[cnt] = f[cnt - 2] + f[cnt - 1];
if(f[cnt] > INF)
break;
}
scanf("%lld", &t);
while(t--) {
scanf("%lld%lld", &n, &k);
dfs(min(n, cnt), k, k + 9);
puts("");
}
return 0;
}