首页 > 其他 > 详细

数位dp(K好数)

时间:2021-01-21 09:27:01      阅读:26      评论:0      收藏:0      [点我收藏+]

Description

如果一个自然数NK进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求LK进制数中K好数的数目。例如K=4,L=2的时候,所有KK好数为11、13、20、22、30、31、33 共7个。给定KL,求LK好数的数目。

Input

从文件读入数据,第一行为K、L,其中K16L10

Output

将结果输出

Samples

Input Copy
4 2
Output
7

Source

学习数位dp就知道f[i][j]////一共有i位且最高位是j的方案数

这个题就是K进制的话,就是最高位最对时K-1

这给题有一个坑就是最高位时1的话就是有k个数,就是得算上0

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
    while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
    return x*f;
}
void out(__int128 x) {
    if (x < 0) {
        x = -x;
        putchar(-);
    }
    if (x >= 10) out(x / 10);
    putchar(x % 10 +0);
}
const int maxn=20;
ll f[maxn][maxn];////一共有i位且最高位是j的方案数
int kk,l;
void inint(){
    cin>>kk>>l;
    for(int i=0;i<=kk-1;i++){
        f[1][i]=1;
    }
    for(int i=2;i<=l;i++){
        for(int j=0;j<kk;j++){
            for(int k=0;k<kk;k++){
                if(abs(j-k)!=1){
                    f[i][j]=(f[i][j]+f[i-1][k]);
                }
            } 
        }
    }
}
int main(){
    inint();
    ll ans=0;
    if(l==1){
        cout<<kk<<endl;
        return 0;
    }
    for(int i=1;i<=kk-1;i++){
        ans=(ans+f[l][i]);
    }
    printf("%lld\n",ans);
} 

 

数位dp(K好数)

原文:https://www.cnblogs.com/lipu123/p/14305907.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!