先贴上运行的结果:
问题描述
我们把一个数称为有趣的,当且仅当:
1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次。
2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。
3. 最高位数字不为0。
因此,符合我们定义的最小的有趣的数是2013。除此以外,4位的有趣的数还有两个:2031和2301。
请计算恰好有n位的有趣的数的个数。由于答案可能非常大,只需要输出答案除以1000000007的余数。
1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次。
2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。
3. 最高位数字不为0。
因此,符合我们定义的最小的有趣的数是2013。除此以外,4位的有趣的数还有两个:2031和2301。
请计算恰好有n位的有趣的数的个数。由于答案可能非常大,只需要输出答案除以1000000007的余数。
输入格式
输入只有一行,包括恰好一个正整数n (4 ≤ n ≤ 1000)。
输出格式
输出只有一行,包括恰好n 位的整数中有趣的数的个数除以1000000007的余数。
样例输入
4
样例输出
3
思路:
1.通过动态规划计算所有的可能数
2.我们知道,因为这些数只能由0 1 2 3三个数字组成,通过上面的规则,可以知道2肯定在首位
3.一个数字可以只包含2,且一个2在首位,后面的都是2
4.一个数字可以只包含2和0,且一个2在首位,后面的0、2位置随意
5.一个数字可以只包含2和3,且一个2在首位,后面只能都是3,否则不符合所有2都在3前面
6.一个数字可以只包含2、0、3,且一个2在首位,后面的0、3位置随意
7.一个数字可以只包含2、0、1,且一个2在首位,后面必须保证0在1之前
8.一个数字可以包含2 0 1 3四个数字,且一个2在首位,0在1之前,末尾只能是1或者3
关键举例:一个只包含203的5位数字,可以由一个只包含20的4位数字通过添加3来得到,也可以由只包含23的4位数字通过添加0来得到,也可以由只包含203的4位数字通过添加0或者3来得到。假设只包含20的4位数字有100个,只包含23的4位数字有100个,包含203的4位数字有100个,那么只包含203的5位数字可能有的个数为100+100+100*2
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
long mod=1000000007;
int n = scan.nextInt();
long data[][]=new long[n][6];
for(int i=0;i<n;i++){
for (int j = 0; j <6 ; j++) {
data[i][j]=0;
}
}
data[0][0]=1;
for(int i=1;i<n;i++){
//整个数字只有2组成
data[i][0]=1;
//整个数字只有20组成
data[i][1]=(data[i-1][0]+data[i-1][1]*2)%mod;
//整个数字只有23组成
data[i][2]=(data[i-1][0]+data[i-1][2])%mod;
//整个数字只有201组成
data[i][3]=(data[i-1][1]+data[i-1][3])%mod;
//整个数字只有203组成
data[i][4]=(data[i-1][1]+data[i-1][2]+data[i-1][4]*2)%mod;
//整个数字有0123三个数字组成
data[i][5]=(data[i-1][3]+data[i-1][4]+data[i-1][5]*2)%mod;
}
System.out.println(data[n-1][5]);
}
}