题意 ;给两个字符串,后面的字符串满足斐波那契:s[1]=A,s[2]=B,s[3]=A+B(拼接) A=“COFFEE” B=“CHICKEN”
现在让你输出第n项的字符串的第K位以后的10位字母,如果后面不足10位,输出到末尾即可
题解:首先len[A]=6.len[B]=7,根据题目数据范围可知在第58项(斐波那契)的时候 已经有大于1e12的位数了,而K最大是1e12,所 以当n>=58 n=58即可。 找第K位 递归找 s[n]=s[n-2]+s[n-1]; 所以第k位总能在第一项或第二项找到。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e6 + 5;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
ll s[100];
string a="COFFEE";
string b="CHICKEN";
char fun(int n,ll k){
if(n==1) return a[k-1];
if(n==2) return b[k-1];
if(k<=s[n-2]) return fun(n-2,k);
else return fun(n-1,k-s[n-2]);
}
int main(){
s[1]=6; s[2]=7;
for(int i=3;i<=60;i++){
s[i]=s[i-2]+s[i-1];
}
int t; cin>>t;
while(t--){
ll n,k;
cin>>n>>k;
if(n>=60) n=58;
for(int i=0;i<=9;i++){
char ch=fun(n,k+i*1ll);
if(ch>='A'&&ch<='Z')
cout<<ch;
else break;
}
cout<<endl;
}
return 0;
}