ccf模拟题 有趣的数

来源:互联网 发布:网络上口口是什么意思 编辑:程序博客网 时间:2024/05/16 00:55
</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)  31 -- (0)  1  (2)  32 --  0   1  (2) (3)3 -- (0) (1) (2)  34 -- (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前面,也只能写3status[i][2]=(status[i-1][0]+status[i-1][2])%mod;//第i个数出现0、1和2的情况:前一个数出现0、2时只能写1,前一个数出现0、1、2时写1或2status[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或3status[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或3status[i][5]=(status[i-1][3]+status[i-1][4]+status[i-1][5]*2)%mod;}System.out.println(status[n][5]);}}

0 0
原创粉丝点击