试题编号: | 201312-4 |
试题名称: | 有趣的数 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 我们把一个数称为有趣的,当且仅当: 输入格式 输入只有一行,包括恰好一个正整数n (4 ≤ n ≤ 1000)。 输出格式 输出只有一行,包括恰好n 位的整数中有趣的数的个数除以1000000007的余数。 样例输入 4 样例输出 3 |
#include<iostream>
using namespace std;
long long dp[1005][10]={0};
long long mod=1000000007;
/*
1.只包含数字2,记为S1
2.只包含数字2和0(0开始的数0个,以此数为前缀的数均不是以0开始),记为S2
3.只包含数字2和3,记为S3
4.只包含数字2、0和1,并且满足所有0在1之前,记为S4
5.只包含数字2、0和3,并且满足所有2在3之前,记为S5
6.包含任意数字(包含0、1、2和3),满足所有0在1之前,满足所有2在3之前,记为S6*/
//S1状态:只有一个数字2,无论长度多少,都只有一种情况,全是2,所以 dp[i][1]=1;
//S2状态:全部由2,0组成,有两种来源,①由S1状态(全是2)在末尾添上一个0,有dp[i-1][1]个数
// ②由少一位的S2状态(2与0的串)在末尾添上一个0或2,有dp[i-1][2]*2个数
//S3状态:全部由2,3组成,有两种来源,①由S1状态(全是2)在末尾添上一个0,有dp[i-1][1]个数
// ②由少一位的S3状态(2与3的串)在末尾添上一个3,有dp[i-1][2]个数
//S4状态:由2,0,1组成,有两种来源,①由S2状态(2与0的串)在末尾添上一个1,有dp[i-1][2]个数
// ②由少一位的S4状态(2,0,1的串)在末尾添加1或2,有dp[i-1][4]*2个数
//S5状态:由2,0,3组成,有三种来源,①在S2状态的基础上(2,0的串)末尾加上一个3,有dp[i-1][2]个数
// ②在S3状态的基础上(2,3的串)末尾加上一个0,有dp[i-1][3]个数
// ③在少一位的S5的基础上(2,0,3的串)末尾添加1或3,有dp[i-1][5]*2个数
//S6状态:由2,0,1,3组成,有三种来源,①在S4状态的基础(2,0,1的串)末尾加上3,有dp[i-1][4]个数
// ②由S5状态(2,0,3的串)末尾加上一个1,有dp[i-1][5]个数
// ③有少一位的S6状态(2,0,1,3的串)在末尾添加1或3,有dp[i-1][6]*2个数
//因为题目要求要0,1,2,3都要有,所以输出i位第六个状态。
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
dp[i][1]=1;
dp[i][2]=(dp[i-1][2]*2+dp[i-1][1])%mod;
dp[i][3]=(dp[i-1][3]+dp[i-1][1])%mod;
dp[i][4]=(dp[i-1][4]*2+dp[i-1][2])%mod;
dp[i][5]=(dp[i-1][5]*2+dp[i-1][2]+dp[i-1][3])%mod;
dp[i][6]=(dp[i-1][6]*2+dp[i-1][4]+dp[i-1][5])%mod;
}
cout<<dp[n][6]%mod;
}
更多相关CCF的试题解答,请点击>>CCF历年认证考试解答