您的位置:首页 > 其它

ccf模拟题 有趣的数

2015-03-28 10:45 197 查看
</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
[5]);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: