UVA 1647 Computer Transformation
https://vjudge.net/problem/UVA-1647
题意:
开始有一个1,接下来每一步1变成01,0变成10
问n不之后00的个数
打表找规律
第3步之后:
如果第i步之后有x个字符,
那么第i+1步之后 的后x个字符与第i步一样
前x个字符是第i步取反
所以00得个数由三部分组成
1、上一步00的个数
2、上一步11的个数
3、当i为偶数时,前x个字符的最后一个是0,后x个字符的第一个是0,00个数+1
f[i][0]=f[i-1][0]+f[i-1][1]+!(i&1)
f[i][1]=f[i-1][0]+f[i-1][1]
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct BigInteger { int len; int num[10001]; BigInteger() { len=0; memset(num,0,sizeof(num));} BigInteger operator + (BigInteger p) const { BigInteger b; b.len=max(len,p.len); int x=max(len,p.len); for(int i=1;i<=x;i++) { b.num[i]+=num[i]+p.num[i]; b.num[i+1]=b.num[i]/10; b.num[i]%=10; } if(b.num[x+1]) x++; b.len=x; return b; } void operator = (BigInteger p) { this->len=p.len; for(int i=1;i<=len;i++) this->num[i]=p.num[i]; } void print() { for(int i=len;i;i--) printf("%d",num[i]); printf("\n"); } }; BigInteger f[1001][2]; BigInteger e; int main() { f[1][0].len=1; f[1][0].num[1]=0; f[2][0].len=1; f[2][0].num[1]=1; e.len=1; e.num[1]=1; for(int i=3;i<=1000;i++) { f[i][1]=f[i-1][0]+f[i-1][1]; if(i&1) f[i][0]=f[i-1][0]+f[i-1][1]; else f[i][0]=f[i-1][0]+f[i-1][1]+e; } int n; while(scanf("%d",&n)!=EOF) f[n][0].print(); }