1sting
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4151 Accepted Submission(s): 1559
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
/*采用递推的思想,求出f(n)=f(n-2)+f(n-1),因为数据量大,采用压位高精度方法,采用普通高精度超时了*/
代码如下
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 1000000
using namespace std;
int a[10000][300];/*一个数组单元存放8位数,总共可以存放2400位数*/
char b[maxn];
int main()
{
int i,j,len,t;
a[1][0]=1;
a[2][0]=2;
for(i=3;i<10000;i++)
{
for(j=0;j<300;j++) a[i][j]+=a[i-1][j]+a[i-2][j];
for(j=0;j<300;j++)
{
if(a[i][j]>=100000000) a[i][j+1]+=a[i][j]/100000000,a[i][j]%=100000000;
}
}
cin>>t;
while(t--)
{
cin>>b;
len=strlen(b);
int max=299;
while(!a[len][max]) max--;
cout<<a[len][max];
for(int i=max-1;i>=0;i--) printf("%08d",a[len][i]);
cout<<endl;
}
return 0;
}