题意
第1个字符串为"COFFEE",第2个字符串为"CHICKEN",第n个字符串由其前2个和前1个连接而成(即s[n]=s[n-2]+s[n-1],注意s[n-2]在s[n-1]的前面),询问第n个字符串从第k个字符开始的连续10个字符是什么(如果还未有10个字符但到达字符串末尾时要停止)
1≤n≤500
1≤k≤min{∣S(n)∣,1012 }. (|S| denotes the length of string s)
题解
Code
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll inf=1e12+10;//k最大为1e12,加上要输出10位,所以inf可取值1e12+10 const int maxn=5e2+10; ll s[maxn]; string ans1="COFFEE",ans2="CHICKEN"; char solve(ll n,ll k) { if(n==1)return ans1[k-1];//数组从0开始,而k从1开始,故需-1 else if(n==2)return ans2[k-1]; if(k>s[n-2]) return solve(n-1,k-s[n-2]); else return solve(n-2,k); } int main() { /*预处理字符串长度*/ s[1]=6,s[2]=7; for(int i=3;i<=500;i++) s[i]=s[i-2]+s[i-1]<=inf?s[i-2]+s[i-1]:inf;//当s[i]>1e12+10时,后面都令等于1e12+10,否则会溢出 int T; cin>>T; ll n,k; while(T--) { cin>>n>>k; for(ll i=k;i<k+10&&i<=s[n];i++)//一个个输出,到10个或超过了字符串总长度就停止(注意这里i要longlong) cout<<solve(n,i); cout<<endl; } return 0; }