2019牛客多校第十场B.Coffee Chicken(递归)

题目传送门

题意

第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个字符但到达字符串末尾时要停止)

1n500
1kmin{S(n),101}. (|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;
}
原文地址:https://www.cnblogs.com/HOLLAY/p/11413979.html