/*Problem E
Time Limit : 5000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 41 Accepted Submission(s) : 12
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
You will be given a string which only contains ‘1’; You can merge two adjacent ‘1’ to be ‘2’, or leave the ‘1’ there. Surly, you may get many different results. For example, given 1111 , you can get 1111, 121, 112,211,22. Now, your work is to find the total number of result you can get.
Input
The first line is a number n refers to the number of test cases. Then n lines follows, each line has a string made up of ‘1’ . The maximum length of the sequence is 200.
Output
The output contain n lines, each line output the number of result you can get .
Sample Input
3
1
11
11111
Sample Output
1
2
8
*/
#include<stdio.h>
#include<string.h>
int main()
{
int i , j, k, n, m, a[1000], b[1000], c[1000];
char s[205];
scanf("%I64d", &n);
getchar();
while(n--)
{
int la = 1, lb = 1,lc = 1;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
gets(s);
m = strlen(s);
if(m == 1 || m == 2)
{
printf("%d\n", m);
continue;
}
a[0] = 1;
b[0] = 2;
for(i = 3; i <= m; i++)
{
memset(c, 0, sizeof(c));
for(j = 0; j < lb; j++)
{
c[j] += b[j] + a[j];
if(c[j] > 9)
{
c[j+1] += c[j] / 10;
c[j] %= 10;
}
}
if(c[lc] > 0)
lc++;
for(k = 0; k < lb; k++)
{
a[k] = b[k];
la = lb;
}
for(k = 0; k < lc; k++)
{
b[k] = c[k];
lb = lc;
}
}
for(i = 0; i < lb; i++)
printf("%d", b[lb-1-i]);
printf("\n");
}
return 0;
}
题意:求题目要求的数列的种类数。
思路:找出4,6,7个1时的种类数,归纳总结出数列的规律。
关键:发现斐波那契。