----------------------------------------------------传送门----------------------------------------------------
Description
KI十分喜欢美丽而优雅的斐波那契数列,最近他新认识了一种斐波那契字符串,定义如下
f (0) = b, f (1) = a,
f (2) = f (1) + f (0) = ab,
f (3) = f (2) + f (1) = aba,
f (4) = f (3) + f (2) = abaab,
......
KI想知道 f (n) 中的第 m 位是什么,你可以帮他解决这个问题吗?
Input
第一行有一个整数 T ,表示测试组数。
接下来的每个测试组包含两个数 n, m 。
数据范围: T≤ 1000, 0 ≤ n ≤ 90, 1≤ m ≤ 1e18
Output
对于每个测试组,输出’a’或者’b’
Sample Input
54 15 310 2222 23366 2333333333333
思路:我们考虑到第n个字符串由第n-1个字符串个第n-2个字符串相加得到,如果我们要找第m个字符,m<=fib[n-1]的话,我们就可以转成求第n-1个字符串的第m个字符,否则,就转换成求第n-2个字符串的第m-fib[a-1]个字符
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll f[100];
void dfs(int n, ll m)
{
if(n == 0) {puts("b"); return;}
if(n == 1) {puts("a"); return;}
if(m <= f[n-1]) dfs(n-1, m);
else dfs(n-2,m-f[n-1]);
}
int main()
{
int t, n; ll m;
f[0] = 1; f[1] = 1;
for(int i = 2; i < 100; i++)
f[i] = f[i-1] + f[i-2];
scanf("%d",&t);
while(t--)
{
scanf("%d%lld",&n,&m);
dfs(n, m);
}
}