POJ 2680 Computer Transformation

题意:

  一个序列,开始时为1,接下来每步,该序列中的1变为01,0变为10,求第n步时序列中连续的0有多少对?

分析:

  令Sn表示第n个序列,~Sn表示第n个序列的反,An表示第n步时序列中连续的0的对数。

  0 : 1

  1 : 01

  2 : 1001

  3 : 01101001

  4 : 1001011001101001

  5 : 01101001100101101001011001101001

 

  观察可得,Sn=~Sn-1+Sn-1;

    (1)n为奇数时,Sn中连续的10的数相同

      ~Sn的末位和Sn的首位都是0

      An+1=An+An+1;

    (2)n为偶数时,Sn中连续的10的少1

      ~Sn的末位是0Sn的首位都是0

       An+1=An+An-1;

 

View Code
#include<cstdio>
#include<cstring>
#define UNIT 100000000
using namespace std;

int a[1010][55];

int main()
{
    int i,j,n;
    memset(a,0,sizeof(a));
    for(i=2;i<=1000;i++)
    {
        for(j=0;j<50;j++)
            a[i][j]=a[i-1][j]*2;
        if(i&1)
        {
            a[i][0]--;
            for(j=0;a[i][j]<0;j++)
                a[i][j]+=UNIT,a[i][j+1]--;
        }
        else
            a[i][0]++;
        for(j=0;j<50;j++)
        {
            a[i][j+1]+=a[i][j]/UNIT;
            a[i][j]%=UNIT;
        }
    }
    for(;scanf("%d",&n)+1;)
    {
        if(n==1)
        {
            puts("0");
            continue;
        }
        for(j=49;!a[n][j];j--);
        printf("%d",a[n][j]);
        for(j--;j>=0;j--)
            printf("%08d",a[n][j]);
        puts("");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xchaos/p/2607575.html