根据题意,首位只能是2
状态:(只管有哪几种数字组成,不管该数字的个数)
第一种:2
第二种:2 0
第三种:2 3
第四种: 2 0 1
第五种:2 0 3
第六种: 2 0 1 3
假设已按规则填完前面 i - 1位数时,有:
b[i-1][0]= 1~ i 位数字中,全部由2组成的个数
b[i-1][1]= 1 ~ i 位数字中,全部由0或者2组成的数的个数
b[i-1][2]= 1 ~ i 位数字中,全部由2或者3组成的数的个数
b[i-1][3]= 1 ~ i 位数字中,全部由0或者1或者2组成的数的个数
b[i-1][4]= 1 ~ i 位数字中,全部由0或者2或者3组成的数的个数
b[i-1][5]= 1 ~ i 位数字中,全部由0或2或1或3组成的数的个数
且有b[1][0]=1,b[1][1]=b[1][2]=b[1][3]=b[1][4]=b[1][5]=0;
所以六种状态的递推式:
①b[i][0] = 1;
②b[i][1] = (b[i-1][0]+b[]i-1][1]*2)%mod
③b[i][2] =b[i][2] = (b[j][0]+b[j][2])%mod;
④b[i][3] = (b[j][1]+b[j][3]*2)%mod;
⑤b[i][4] = (b[j][1]+b[j][2]+b[j][4]*2)%mod;
⑥b[i][5] = (b[j][3]+b[j][4]+b[j][5]*2)%mod;
输出结果:b[n][5]。
代码如下:
#include <iostream>
#include<cstring>
using namespace std;
const long mod = 1000000007;
const int maxSize = 1005;
int main(){
int n;
long long b[maxSize][7];
for (int i = 0 ; i<6;i++)
b[0][i] = 0;
cin>>n;
for(int i = 1;i<=n;i++){
int j = i-1;
b[i][0] = 1;
b[i][1] = (b[j][0]+2*b[j][1])%mod;
b[i][2] = (b[j][0]+b[j][2])%mod;
b[i][3] = (b[j][1]+b[j][3]*2)%mod;
b[i][4] = (b[j][1]+b[j][2]+b[j][4]*2)%mod;
b[i][5] = (b[j][3]+b[j][4]+b[j][5]*2)%mod;
}
cout<<b[n][5]<<endl;
return 0;
}