UVa 1647 - Computer Transformation

题目:初始给你一个1,然后每一次1变成01,0变成10求变化n步后,有多少个00。

分析:数学题。我们观察变化。 

            00 -> 1010 出现 10、01

            01 -> 1001 出现 10、00、01

            10 -> 0110 出现 01、11、10

            11 -> 0101 出现 01、10

            只有01下一步会生成00,但是00、01、10、11都会生成01,每一个1都会生成01,而00也可以生成01,

            由此分成两种情况计算;设O(n)是变化n步后1的个数,Z(n)是变化n步后生成的00的个数,有结论:

             Z(n)= Z(n-2)+ O(n-2),O(n)= 2^(n-1){无论0、1都会生成0与1,所以是位数的一半}

说明:数据较大,用数组模拟大整数运算。

#include <iostream>
#include <cstdlib>    
#include <cstring>
#include <cstdio>      
    
using namespace std;    
  
int O[1010][100];
int Z[1010][100];
  
int main(){
	memset( O, 0, sizeof(O) );
	memset( Z, 0, sizeof(Z) );
	O[0][0] = O[1][0] = 1;
    for ( int i = 2 ; i < 1001 ; ++ i ) 
	for ( int k = 0 ; k < 100  ; ++ k ) {
		O[i][k] += O[i-1][k] + O[i-1][k];
		Z[i][k] += O[i-2][k] + Z[i-2][k];
		O[i][k+1] += O[i][k]/10000; O[i][k] %= 10000;
		Z[i][k+1] += Z[i][k]/10000; Z[i][k] %= 10000;
	}
    
    int n;
    while( ~scanf("%d",&n) ) {
        int end = 99;
		while ( end > 0 && !Z[n][end] ) -- end;
		printf("%d",Z[n][end --]);
		while ( end >= 0 )
			printf("%04d",Z[n][end --]);
		printf("\n");
    }    
    return 0;    
}   

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值