牛客暑期集训第十场B题(签到题递归的简单应用)

本文介绍了一道由coffeechicken团队提出的编程竞赛题目,使用斐波那契原理求解特殊字符串序列的问题。通过递归算法,高效计算指定位置的字符,避免了直接模拟的内存限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://ac.nowcoder.com/acm/contest/890/B
这是题目链接,这是咖啡鸡出的一道题,所以就叫coffee chicken哈哈,很强的一个队伍,给你两个初始的字符串,利用斐波那契原理求s3,s4…长度最大不超过1e12,给你个n和k,求出sn从k-k+10的字符,这题内存给的就是卡你直接模拟就不行,所以就得递归,来求出si = si-1 + si-2;所以就f(n,k)表示第n个字符串,的第k个字符串,所以就可以写出递归方程,见下面AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf = 1e12+50;
const ll mod = 1e9 + 7;
string ans1 = "COFFEE",ans2 = "CHICKEN";
ll s[505];
char f(ll k,ll x)
{
    if(k == 1)
    {
        return ans1[x-1];
    }
    if(k == 2)
    {
        return ans2[x-1];
    }
    if(x > s[k - 2])
    {
        return f(k - 1,x - s[k - 2]);//比s[k-2]大,所以就要s[k-1],只需要看后面的s[k-1],就会减去s[k-2].
    }
    else
    {
        return f(k - 2,x);//这个就是x不够s[k-2],所以就x-2,x不变。
    }
}
int main()
{
   int T;
   cin >> T;
   s[1] = 6;s[2] = 7;
   for(int i = 3;i <= 500;i++)
   {
       s[i] = min(s[i-1]+s[i-2],inf);
   }
   while(T--)
   {
       ll n,k;
       cin >> n >> k;
       for(ll i = k;i < k + 10 && i <= s[n];i++)
       {
           cout << f(n,i);
       }
       cout << endl;
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值