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;
}
}