666

如果一个数字字符串(只包含0-9,可以有前导0)中出现且只出现1次666,我们就称这个字符串是好的。

例如1666、03660666是好的,6666、66、123不是好的。

请你计算长度为N的数字字符串中,有多少个是好的。由于总数可能很大,你只需要输出总数模1000000007的余数。

Input

一个整数N。  

对于30%的数据,1 ≤ N ≤ 8  

对于100%的数据,1 ≤ N ≤ 1000

Output

一个整数代表答案。

Sample Input

4

Sample Output

18
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
const int mod=1e9+7;
#define ll long long
ll dp[maxn][3];
void solve(int n){
	for(int i=1;i<=n;i++){
		dp[i][0]=(dp[i-1][0]+dp[i-1][1]+dp[i-1][2])*9%mod;
		dp[i][1]=(dp[i-1][0]);
		dp[i][2]=dp[i-1][1];
	}
	ll res=0;
	for(int i=1;i<=n-2;i++){
		res=res+(dp[i][1]*dp[n-i][2])%mod;
		res%=mod;
	}
	cout<<res<<endl;
	return ;
}
int main(){
	int n;
	cin>>n;
	dp[0][0]=1;
	solve(n);
	return 0;
}

此题一开始就比较混乱了,完全没思路,感觉到应该是动态规划。不会做。

要保证一个666,没有其他的,那么拆开是,1个6和,2个66,那就说明是两个拼凑,看来两个子问题要视情况而定,

这样的话,其他的可以是2个6,1个6,0个6,想到这也是子问题的一部分。

这个吧,推一下,应该不是很大问题。虽然说是比较巧,对一些人来说,只是花费一点时间而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值