4245: KI的斐波那契
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 584 Solved: 218
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
HINT
Source
原题链接:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4245.思路:直接暴力模拟肯定不行。我们考虑到第n个字符串由第n-1个字符串个第n-2个字符串相加得到,如果我们要找第m个字符,m<=fib[n-1]的话,我们就可以转成求第n-1个字符串的第m个字符,否则,就转换成求第n-2个字符串的第m-fib[a-1]个字符。这样的话就能建立递归表达式来求救此问题,当然,首先要求出前90个Fibonacii数的值。
AC代码:
/**
* 行有余力,则来刷题!
* 博客链接:http://blog.youkuaiyun.com/hurmishine
*
*/
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=100;
typedef long long LL;
LL fib[maxn]={1,1};
char ans;
void getFib()
{
for(int i=2;i<=95;i++)
fib[i]=fib[i-1]+fib[i-2];
}
void DFS(LL n,LL m)
{
if(n==0)
{
ans='b';
return;
}
if(n==1)
{
ans='a';
return;
}
if(m<=fib[n-1])
DFS(n-1,m);
else
DFS(n-2,m-fib[n-1]);
}
int main()
{
//freopen("data.txt","r",stdin);
getFib();
int T;
cin>>T;
LL n,m;
while(T--)
{
cin>>n>>m;
DFS(n,m);
cout<<ans<<endl;
}
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);
}
}