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 }