k好数(动态规划)

简介: k好数(动态规划)

问题描述


如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。


输入格式


输入包含两个正整数,K和L。


输出格式


输出一个整数,表示答案对1000000007取模后的值。


样例输入

4 2

样例输出

7

数据规模与约定


对于30%的数据,KL <= 106;


对于50%的数据,K <= 16, L <= 10;


对于100%的数据,1 <= K,L <= 100。


解题思路


对于本题使用动态规划是最简单的,只要保证相邻的两位绝对值不为 1即可,每次高位遍历一个数据都要进行重新计算是数据规模逐渐庞大,所以必须每次都进行模运算。在二维数组中存储含义:行为位数,列为此位可以从0到k存的数(这里的k就是进制上限),二维数组储存的是若最高位(当前最高位)是这个数那么他可以存在多少个k好数

Gcc编译通过

#include<stdio.h>
#include <math.h>
#define mod 1000000007
#define N 105
int Num[N][N]={0};
long long KGoodNumber(int k,int l)
{
    long long cnt=0;
    int i,j,x;
    for(i=0;i<k;i++){Num[1][i]=1;}
    for(i=2;i<=l;i++){
        for(j=0;j<k;j++){
            for(x=0;x<k;x++){
                if(abs(j-x)!=1){
                    Num[i][j]+=Num[i-1][x];
                    Num[i][j]%=mod;
                }
            }
        }
    }
    for(i=1;i<k;i++){//最高位不能为0
        cnt+=Num[l][i];
        cnt%=mod;
    }
    printf("%lld",cnt);
}
int main(void)
{
    int k,l;
    scanf("%d%d",&k,&l);
    KGoodNumber(k,l);
    return 0;
}


500B

C

正确

100

15ms

824.0KB

相关文章
|
6月前
|
算法 测试技术 C++
|
6月前
|
C++ NoSQL 容器
动态规划三
动态规划三
|
算法
【学会动态规划】按摩师(11)
【学会动态规划】按摩师(11)
53 0
|
6月前
|
机器人 NoSQL 容器
动态规划一
动态规划一
|
存储
【动态规划】
【动态规划】
|
机器学习/深度学习 算法
动态规划详解
前段时间一直在做关于数据结构的题,也算是对数据结构有了一定的了解,知道了有些数据结构的基本算法。现在刚刚开始接触动态规划,其实写这篇文章的初衷是一来锻炼一下自己的总结能力,二来也是希望通过这篇文章,来指引和我一样的初学者,废话不多说了,开始吧。
57 0
动态规划-子序列问题
前言 在上篇文章我们学习了动态规划的公共子序列问题,现在我们来学习下动态规划的单字符串子序列问题。
|
机器学习/深度学习
朝题夕解之动态规划(5)
朝题夕解之动态规划(5)
200 0
朝题夕解之动态规划(5)