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;
}
时间: 2024-12-29 07:20:41

UVa 1647 - Computer Transformation的相关文章

UVa 1647 - Computer Transformation 解题心得

这个题目.... 想上题意 10935 Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 at the top and card n at the bottom. The following operation is performed as long as there are at least two cards in the deck: Throw away the to

H - Computer Transformation(简单数学题+大数)

H - Computer Transformation Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice _ Appoint description:  System Crawler  (Oct 10, 2016 1:02:59 PM) Description A sequence consisting of one digit, the numb

hdu_1041(Computer Transformation) 大数加法模板+找规律

Computer Transformation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8367    Accepted Submission(s): 3139 Problem Description A sequence consisting of one digit, the number 1 is initially wri

(大数)Computer Transformation hdu1041

Computer Transformation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8688    Accepted Submission(s): 3282 Problem Description A sequence consisting of one digit, the number 1 is initially wr

UVa 1647 (递推) Computer Transformation

题意: 有一个01串,每一步都会将所有的0变为10,将所有的1变为01,串最开始为1. 求第n步之后,00的个数 分析: 刚开始想的时候还是比较乱的,我还纠结了一下000中算是有1个00还是2个00 最终想明白后,并不会出现这样的子串. 总结了几个要点: 第n步之后,串的长度为2n,且0和1的个数相等,分别为2n-1 1经过两步变化为1001,所以每个1经过两步变化就会得到一个00,而且这个00分别被左右两边一个1包围着,不会与其他数字凑出额外的00 0经过两步变化为0110,所以00就会变成0

ACM学习历程—HDU1041 Computer Transformation(递推 &amp;&amp; 大数)

Description A sequence consisting of one digit, the number 1 is initially written into a computer. At each successive time step, the computer simultaneously tranforms each digit 0 into the sequence 1 0 and each digit 1 into the sequence 0 1. So, afte

Computer Transformation(hdoj 1041)

Problem Description A sequence consisting of one digit, the number 1 is initially written into a computer. At each successive time step, the computer simultaneously tranforms each digit 0 into the sequence 1 0 and each digit 1 into the sequence 0 1.

HDOJ-1041 Computer Transformation(找规律+大数运算)

http://acm.hdu.edu.cn/showproblem.php?pid=1041 有一个初始只有一个1的串 每次都按①0 -> 10;②1 -> 01;这两条规则进行替换 形如:n = 1  1 n = 2  01 n = 3  1001 ... 求经过n步替换之后 串中只含复数个0的连续子串(不难发现,这种子串只能是‘00’)的出现次数 因为0<n<=1000的限制 在最坏情况下(n==1000)串的长度将达到2^1000位 排除了直接模拟上述替换过程的可能 列出前几

HDU 1041[Computer Transformation] 递推 高精度

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1041 题目大意:初始数字1.规则1变成01,0变成10.问经过N次完整变换后,有多少连续零对. 关键思想:考虑零对的直接来源只有"10",而"10"的直接来源只有"1"或者"00".于是可以得到以下几种递推式 1. dp[i]=pow(2,i-3)+dp[i-2];当前层多少1,下一层就多少10,下下层就多少00:当前层多少00,