bnu 4359(数位dp)
题目链接:http://gnu.bnu.edu.cn/contest/problem_show.php?pid=4359
思路:直接递推就可以了,dp[i][0]表示前i位不含4或者13,且最后一位不为1的个数,dp[i][1]表示前i位不含4或者13,最后一位为1的个数;于是有dp[i][0]=8*dp[i-1][0]+7*dp[i-1][1],dp[i][1]=dp[i-1][0]+dp[i-1][1];
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 #define MAXN 1000010 7 #define MOD 100000000 8 typedef long long ll; 9 int n; 10 ll dp[MAXN][2]; 11 //dp[i][0]表示前i位不含4和13且不以1结尾的; 12 //dp[i][1]表示前i位不含4和13但以1结尾的; 13 14 int main(){ 15 dp[0][0]=1; 16 for(int i=1;i<MAXN;i++){ 17 dp[i][0]=(7*dp[i-1][1]+8*dp[i-1][0])%MOD; 18 dp[i][1]=(dp[i-1][0]+dp[i-1][1])%MOD; 19 } 20 int _case; 21 scanf("%d",&_case); 22 while(_case--){ 23 scanf("%d",&n); 24 printf("%08d\n",int((dp[n][0]+dp[n][1])%MOD)); 25 } 26 return 0; 27 }