Description
如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K=4,L=2的时候,所有KK好数为11、13、20、22、30、31、33 共7个。给定K、L,求L位K好数的数目。
Input
从文件读入数据,第一行为K、L,其中K≤16,L≤10。
Output
将结果输出
Samples
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 ",ans); }