coding | java - ccf模拟题 有趣的数

</pre><pre name="code" class="java">import java.util.Scanner;

public class FunnyNumber {

	/**
	 * 	1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次。
		2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。
		3. 最高位数字不为0。
	 */
	public static void main(String[] args) {
		/*
		 * 定义状态数组status[n + 1][6],status[i][j]表示填到第i位数(从左至右填)时处于第j个状态,状态定义如下:
			0 --  0   1  (2)  3
			1 -- (0)  1  (2)  3
			2 --  0   1  (2) (3)
			3 -- (0) (1) (2)  3
			4 -- (0)  1  (2) (3)
			5 -- (0) (1) (2) (3)
		       括号中的数表示这个数已经出现过。可以验证,数字2必须首先出现。
		       以上6个状态是所有的可达状态,其它状态都不合法。
		 */
		
		Scanner s = new Scanner(System.in);
		int n = s.nextInt();
		
		long mod = 1000000007;
		long status[][] = new long[n+1][6];
		
		for(int i = 0;i<6;i++){
			status[0][i]=0;//不看第0行
		}
		
		for(int i = 1;i<n+1;i++){
			status[i][0]=1;//第i个数只出现2的情况只有一种
			
			//第i个数出现0和2的情况:前一个数出现2时只能写0,前一个数出现0和2时0、2都能写
			status[i][1]=(status[i-1][0]+status[i-1][1]*2)%mod;
			
			//第i个数出现2和3的情况:前一个数出现2时只能写3,前一个数出现2或3时,因为所有2在3前面,也只能写3
			status[i][2]=(status[i-1][0]+status[i-1][2])%mod;
			
			//第i个数出现0、1和2的情况:前一个数出现0、2时只能写1,前一个数出现0、1、2时写1或2
			status[i][3]=(status[i-1][1]+status[i-1][3]*2)%mod;
			
			//第i个数出现0、2和3的情况:前一个数出现0、2时写3,前一个数出现2、3时写0,前一个数出现0、2、3写0或3
			status[i][4]=(status[i-1][1]+status[i-1][2]+status[i-1][4]*2)%mod;
			
			//第i个数出现0、1、2和3的情况:前一个数出现0、1、2时写3,前一个数出现0、2、3时写1,
			//前一个数出现0、1、2、3时写1或3
			status[i][5]=(status[i-1][3]+status[i-1][4]+status[i-1][5]*2)%mod;
		}
		
		System.out.println(status[n][5]);
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值