hdu1865 1sting

http://acm.hdu.edu.cn/showproblem.php?pid=1865

简单递推+大数。
    ans[n]=ans[n-1]+ans[n-2]。
   
由于数字只有'1'和'2'这两种,那么当让第n
位为1的时候,ans[n]加上ans[n-1];当让最后两位
合并成2的时候,ans[n]加上ans[n-2](因为要保证
倒数第二位一定是1)。
 
  算出来的ans就是一个斐波那契数列。

View Code
 1 #include"stdio.h"   
 2 #include"string.h"   
 3 #include"stdlib.h"   
 4 #define N 211   
 5 #define M 33   
 6 int ans[N][M],len[N];  
 7 void init()  
 8 {  
 9     int i,l;  
10     memset(len,0,sizeof(len));  
11     memset(ans,0,sizeof(ans));  
12     len[1]=len[2]=1;  
13     ans[1][0]=1;  
14     ans[2][0]=2;  
15     for(i=3;i<=200;i++)  
16     {  
17         for(l=0;l<len[i-1];l++)  
18         {  
19             ans[i][l]+=ans[i-1][l]+ans[i-2][l];  
20             ans[i][l+1]+=ans[i][l]/1000000;  
21             ans[i][l]%=1000000;  
22         }  
23         len[i]=len[i-1];  
24         if(ans[i][len[i]])  len[i]++;  
25     }  
26 }  
27 int main()  
28 {  
29     init();  
30     int T;  
31     int l,L,i,j;  
32     char str[211];  
33     scanf("%d",&T);  
34     while(T--)  
35     {  
36         scanf("%s",str);  
37         L=strlen(str);
38     
39         printf("%d",ans[L][len[L]-1]);  
40         for(l=len[L]-2;l>=0;l--) printf("%06d",ans[L][l]);  
41         printf("\n");  
42     }  
43     return 0;  
44 }  

 

posted @ 2013-04-30 10:16  zlyblog  阅读(295)  评论(0编辑  收藏  举报