题目大意
求有多少个n位的k进制数不包含连续的两个零。
解题思路
显然数位dp具体看代码。
code
#include<set>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
using namespace std
int const maxn=1800,mod=100000000
int n,K,ans[maxn+10]
struct number{int bit,num[maxn/8+10]
number f[maxn+10][5]
void copy(number &x,number &y){
y.bit=x.bit
fo(i,1,y.bit)y.num[i]=x.num[i]
}
void plu(number &x,number &y,number &z){
z.bit=max(x.bit,y.bit)
fo(i,1,z.bit){
z.num[i]+=x.num[i]+y.num[i]
z.num[i+1]=z.num[i]/mod
z.num[i]%=mod
}
for(
}
void plusmult(number &x,number &y,int v,number &z){
plu(x,y,z)
fo(i,1,z.bit)z.num[i]*=v
fo(i,1,z.bit){
z.num[i+1]+=z.num[i]/mod
z.num[i]%=mod
}
for(
}
int main(){
freopen("d.in","r",stdin)
freopen("d.out","w",stdout)
scanf("%d%d",&n,&K)
f[1][1].num[1]=K-1
fo(i,2,n){
copy(f[i-1][1],f[i][0])
plusmult(f[i-1][0],f[i-1][1],K-1,f[i][1])
}
plu(f[n][0],f[n][1],f[n][2])
fo(i,1,f[n][2].bit)
fo(j,1,8){
ans[++ans[0]]=f[n][2].num[i]%10
f[n][2].num[i]/=10
}
for(
fd(i,ans[0],1)printf("%d",ans[i])
return 0
}