颜文字题目吼吼……题目在这里
题目大意:
是说有一段无限延伸的字符串,(这段字符串是由颜文字构成的哈哈),字符串的延伸规律如下:
假设A=“T.T”,B=“^__^”,那么C="T.T^__^",然后A=B,B=C;这个无限延伸的字符串说的是C。给你一个数n,要求输出在这个无限延伸的字符串里的第n位的字符是什么。
题目思路:
首先看题目给的数据,2^63-1,已经到达long long的边界了,显然开这么大的数组是不现实的,但是有没有发现无论字符串延伸多么长,一共就只有7个字符,而且类似循环的在延伸(其实是在递推这延伸)
因为第三个串由前两个串拼接,这和斐波那契数列的定义一致,所以我们可以先求出串长的斐波那契数列,存放在数组中,然后求解每组数据;由于当前串是前两个串拼接而来,对于给定的n,可以找到大于n的最小的串长,那么n一定在前两个串中,假设紧邻的三个串分别是A,B,C,当前n在C中,由于n大于B,所以n一定在A中,由题意,A在B后,所以n-len(B)即在A中的位置,如此循环直到n小于7.
不过这道题错了好多次,一直返回段错误,后来发现我把数组开得太大了……开到了10^8(记住记住
题目代码:
#include<iostream>
#include<cstdio>
#include<string>
#define maxn 2000000
using namespace std;
long long f[maxn];
int main(void)
{
string str="T.T^__^";
long long n;
//scanf("%lld",&n);
f[1]=4;
f[2]=3;
for(int i=3;i<maxn;i++)
{
f[i]=f[i-1]+f[i-2];
}
while(~scanf("%lld",&n))
{
while(n>7)
{
long long i=1;
while(n>f[i])//寻找超过询问位置的字符串
{
i++;
}
n-=f[i-1];
}
printf("%c\n",str[n-1]);
//cout<<str[n-1]<<endl;
}
return 0;
}
呼呼