https://ac.nowcoder.com/acm/contest/890/B
给你两个字符串
s[1]="COFFEE" s[2]="CHICKEN"
s[i]=s[i-2]+s[i-1]
给你 i 和 k
输出i的第k之后的10个字符 不足10个有几个输出几个
递归 k最大为1e12
s[i]=s[i-2]+s[i-1] 可以判断第k个字符要么属于前半段 要么属于后半段
我们写一个函数 取的是单个字符
#include<algorithm>
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<ctime>
#include<map>
#include<stack>
#include<queue>
#include<set>
#include<cstring>
#include<unordered_map>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long ll;
typedef long double ld;
const ll maxn = 1e12;
const string s[2] = { "COFFEE","CHICKEN" };
ll f[505];
char getans(int n, ll k) {
for (; n > 2;) {
if (f[n - 2] >= k) n -= 2;//k在n-2部分 前半部分 更新n
else {
k -= f[n - 2];//在后半段 减去前半段的长度
n--;//更新n
}
}
return s[n - 1][k - 1];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
f[1] = 6;
f[2] = 7;
for (int i = 1; i <= 500; i++) {
if (i > 2) {
f[i] = min((ll)(1e12 + 20), f[i - 1] + f[i - 2]);
}
}
int t;
cin >> t;
while (t--) {
int n;
ll k;
cin >> n >> k;
for (int i = 1; i <= 10; i++) {
if (k + i - 1 <= f[n]) {//在字符串范围内
putchar(getans(n, k + i - 1));
}
}
puts("");
}
return 0;
}







Comments | NOTHING