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
Output
对于每个测试组,输出’a’或者’b’
Sample Input
54 15 310 2222 23366 2333333333333
这道题观察f[0]有1位,f[1]有1位,f[2]有3位....f[5]有8位数,正好对应费波纳茨的那个数的和,所以用费波纳茨可以知道第n位的位数,然后之所以用到dfs就是如果m<len(f[n-1])说明是f[n-1]的第m个字符,否则是f[n-2]的第m-f[n-1]个字符,总是得到规模更小的子问题。
#include<iostream>
#include<cstdio>
#include<cstring>
typedef long long ll;
using namespace std;
ll f[105];
int dfs(ll n,ll m)
{
if(n==1) return 1;
if(n==2) return m==1?1:0;
if(m>f[n-1]) return dfs(n-2,m-f[n-1]);
else return dfs(n-1,m);
}
int main()
{
int T;cin>>T;
while(T--)
{
int t=0;
memset(f,0,sizeof(f));
ll n,m;
cin>>n>>m;
f[0]=1,f[1]=1;
for(int i=2;i<=n;i++)
{
f[i]=f[i-1]+f[i-2];
}
dfs(n,m)?puts("a"):puts("b");
}
return 0;
}