HDU 1041 Computer Transformation

这道题目的意思是:一开始有一个数字 1 ,在接下来的时间中,计算机会按照如下规则进行扩展:

               0 –> 1 0

               1 –> 0 1

求n秒之后,有多少对相邻的0。 例如1 0 0 1有 1 对相邻的0.

 

这道题目是一道规律题,可以直接例举前面的数据得到规律:

0 0 1 1 3 5 11 21 43 85

通过例举的数据可以很明显的看出,从第 1s 开始,如果是偶数秒,那么b[ i ] = b[ i – 1 ] * 2 – 1,而奇数秒则是b[ i ] = b[ i – 1 ] * 2 + 1。于是可以预处理打表得出0 ~ 1000的结果。

需要注意的是,这道题需要用到高精度,因为最大的值约为 2 ^ 1000,这个数非常大。

附AC代码:

   1: #include <iostream>
   2: #include <string>
   3: #include <algorithm>
   4: using namespace std;
   5:  
   6: int s[1005][505];
   7: int num, temp = 0;
   8:  
   9: int main()
  10: {
  11:     s[0][1] = 0;
  12:     s[1][1] = 0;
  13:     s[2][1] = 1;
  14:     s[3][1] = 1;
  15:     for(int i = 4; i <= 1000; ++i)
  16:     {
  17:         for(int j = 1; j <= 500; ++j)
  18:         {
  19:             s[i][j] = s[i - 1][j] + 2 * s[i - 2][j] + temp;
  20:             temp = s[i][j] / 10;
  21:             s[i][j] %= 10;
  22:         }
  23:     }
  24:     while(~scanf("%d", &num))
  25:     {
  26:         if(num == 1) 
  27:             puts("0");
  28:         else
  29:         {
  30:             int i;
  31:             for(i = 500; i > 0; --i)
  32:                 if(s[num][i] != 0)
  33:                     break;
  34:             for(int j = i; j >= 1; --j)
  35:                    printf("%d", s[num][j]);
  36:             puts("");
  37:         }
  38:     }
  39:     return 0;
  40: }
posted @ 2013-07-19 16:33  ~無痕~  阅读(372)  评论(0编辑  收藏  举报