如果一个数字字符串(只包含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,想到这也是子问题的一部分。
这个吧,推一下,应该不是很大问题。虽然说是比较巧,对一些人来说,只是花费一点时间而已。