有趣的数

根据题意,首位只能是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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值