53.FIB词链
2016-03-07 22:10
357 查看
时间限制: 1 s
空间限制:
128000 KB
题目等级
: 大师 Master
题解
题目描述 Description
Fibonacci词定义如下:FIB1 = b FIB2 = a 当k >= 1时, FIBk+2 = FIBk+1*FIBk
其中* 表示词的连接。因此,我们有:
FIB3 = ab; FIB4 = aba; FIB5 = abaab; FIB6 = abaababa.
问题是,对给定的词,问该词在FIBn中出现多少次。
输入描述 Input Description
输入有两行,第一行为给出的只含有a 或 b的词,长度不超过30.第二行给出一个正整数n, n <= 200.
输出描述 Output
Description
对给定的词,输出在FIBn中出现的次数
样例输入 Sample Input
aba
6
样例输出 Sample Output
3
错误代码:
#include
using namespace std;
#include
#include
char fib[201][1000000],ch[31],n,sum=0;
void input();
void search();
int main()
{
input();
search();
printf("%d",sum);
return 0;
}
void search()
{
int chlong=strlen(ch),fiblong=strlen(fib
);
int fibl=0,chl=0;
while(fibl
{
int cpyfibl=fibl;
while(fib
[cpyfibl]==ch[chl]&&chl
{
chl++;
cpyfibl++;
}
if(chl==chlong)
{
sum++;
chl=0;
}
if(chl!=chlong)
{
chl=0;
}
fibl++;
}
}
void input()
{
scanf("%s",ch);
scanf("%d",&n);
fib[1][0]='b';
fib[2][0]='a';
for(int i=3;i<=n;++i)
{
strcpy(fib[i],fib[i-1]);
strcat(fib[i],fib[i-2]);
}
}
记录第i个词的前M-1位和后M-1位,在递推的时候合并并且更新答案就可以了。
其中M表示所求字符串的长度。
特判:如果M=0的话直接上Fib数。
注意要高精,压四位很好写吧,那个20的常数是高精带来的。
空间限制:
128000 KB
题目等级
: 大师 Master
题解
题目描述 Description
Fibonacci词定义如下:FIB1 = b FIB2 = a 当k >= 1时, FIBk+2 = FIBk+1*FIBk
其中* 表示词的连接。因此,我们有:
FIB3 = ab; FIB4 = aba; FIB5 = abaab; FIB6 = abaababa.
问题是,对给定的词,问该词在FIBn中出现多少次。
输入描述 Input Description
输入有两行,第一行为给出的只含有a 或 b的词,长度不超过30.第二行给出一个正整数n, n <= 200.
输出描述 Output
Description
对给定的词,输出在FIBn中出现的次数
样例输入 Sample Input
aba
6
样例输出 Sample Output
3
错误代码:
#include
using namespace std;
#include
#include
char fib[201][1000000],ch[31],n,sum=0;
void input();
void search();
int main()
{
input();
search();
printf("%d",sum);
return 0;
}
void search()
{
int chlong=strlen(ch),fiblong=strlen(fib
);
int fibl=0,chl=0;
while(fibl
{
int cpyfibl=fibl;
while(fib
[cpyfibl]==ch[chl]&&chl
{
chl++;
cpyfibl++;
}
if(chl==chlong)
{
sum++;
chl=0;
}
if(chl!=chlong)
{
chl=0;
}
fibl++;
}
}
void input()
{
scanf("%s",ch);
scanf("%d",&n);
fib[1][0]='b';
fib[2][0]='a';
for(int i=3;i<=n;++i)
{
strcpy(fib[i],fib[i-1]);
strcat(fib[i],fib[i-2]);
}
}
记录第i个词的前M-1位和后M-1位,在递推的时候合并并且更新答案就可以了。
其中M表示所求字符串的长度。
特判:如果M=0的话直接上Fib数。
注意要高精,压四位很好写吧,那个20的常数是高精带来的。