CCF 2013-12-4 有趣的数 100分

试题编号:201312-4
试题名称:有趣的数
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  我们把一个数称为有趣的,当且仅当:
  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

 

#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历年认证考试解答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值