KI的斐波那契
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
Sample Output
aaaba
思路:直接暴力模拟肯定不行。我们考虑到第n个字符串由第n-1个字符串个第n-2个字符串相加得到,如果我们要找第m个字符,m<=fib[n-1]的话,我们就可以转成求第n-1个字符串的第m个字符,否则,就转换成求第n-2个字符串的第m-fib[a-1]个字符。这样的话就能建立递归表达式来求救此问题,当然,首先要求出前90个Fibonacii数的值。
代码示例:
#include<stdio.h>
typedef long long int ll;
ll a[100];
void zxc(int n,ll m)
{
if(n==0)
{
puts("b");
return ;
}
if(n==1)
{
puts("a");
return ;
}
ll temp=a[n-1];
if(m<=a[n-1])
zxc(n-1,m);
else
zxc(n-2,m-temp);
}
int main()
{
int t,i;
scanf("%d",&t);
a[0]=1,a[1]=1;
for(i=2; i<=91; i++)
a[i]=a[i-1]+a[i-2];
while(t--)
{
int n;
ll m;
scanf("%d%lld",&n,&m);
zxc(n,m);
}
return 0;
}
标码示例:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f[100];
void dfs(int n, ll m) {
if(n == 0) {puts("b"); return;}
if(n == 1) {puts("a"); return;}
ll tmp = f[n];
if(m > tmp) dfs(n-2, m-tmp);
else dfs(n-1, m);
}
int main() {
int t;
freopen("read.in", "r", stdin);
freopen("write.out", "w", stdout);
scanf("%d", &t);
while(t --) {
int n;
ll m;
scanf("%d%I64d", &n, &m);
f[0] = 0; f[1] = 1;
for(int i = 2; i <= n+1; i ++) {
f[i] = f[i-2] + f[i-1];
}
dfs(n, m);
}
}