(大数+递推)poj2680 Computer Transformation

传送门:poj2680 Computer Transformation

题意:

电脑里一开始有一个数字1,它有一个规则:经过一个时间片之后0转化成10,1转化成01。所以,一个时间片后获得01这个序列,两个时间片后获得序列1001,三个时间片后获得序列01101001,,,(有点像细胞分裂对不对?!每过一个时间片0会分裂成1和0,1会分成0和1,只不过数字之间是有顺序的)

问n个时间片后,序列中会有几个“00”?

题解:

递推+大数。

0在转化的过程中会产生0和1,1在转化的过程中会产生0和1,所以序列中最多有2个0连续。只有1001才会有一个“00”,1001来源于上一步的01,而01又来源于上一步的1和00。所以第i步“00”的个数=倒数第二个时间片的“00”的个数+倒数第二个时间片的1的个数。

因此,设p[i]为i时间片后“00”的个数,则有p[i]=p[i-2]+2^(i-3),(i>2),p[1]=0,p[2]=1.

而i的最大取值是1000,从递推式2^(1000-3),可以看出需要使用大数了。

代码:

import java.math.BigInteger;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		final int maxn=1010;
		BigInteger p[]=new BigInteger[maxn];
		p[1]=BigInteger.valueOf(0);
		p[2]=BigInteger.valueOf(1);
		for(int i=3;i<=1000;i++) {
			p[i]=BigInteger.valueOf(2).pow(i-3).add(p[i-2]);
		}
		int n;
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()) {
			n=sc.nextInt();
			System.out.println(p[n]);
		}
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值