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中连续的1和0的数相同
~Sn的末位和Sn的首位都是0,
An+1=An+An+1;
(2)当n为偶数时,Sn中连续的1比0的少1
~Sn的末位是0,Sn的首位都是0,
An+1=An+An-1;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }