分析
其实还可以使用数位dp的方法。
状态转移方程:
f
[
i
]
=
(
k
+
1
)
i
,
不
受
限
制
时
的
方
案
数
f[i]=(k+1)^i,不受限制时的方案数
f[i]=(k+1)i,不受限制时的方案数
g
[
i
]
表
示
受
限
制
时
的
方
案
数
(
最
后
减
一
避
免
0
)
g[i]表示受限制时的方案数(最后减一避免0)
g[i]表示受限制时的方案数(最后减一避免0)
如果这一位本来超过了限制,那么也就是说只能有k+1种,
否则走这一位(走多了会超限)。
→→→
n
u
m
>
k
→
f
[
i
]
∗
(
k
+
1
)
{num>k}→{f[i]*(k+1)}
num>k→f[i]∗(k+1)
g[i]=//num=该位的数字
→→→
n
u
m
<
=
k
→
g
[
i
−
1
]
+
f
[
i
]
∗
n
u
m
{num<=k}→{g[i-1]+f[i]*num}
num<=k→g[i−1]+f[i]∗num
代码
#include <cstdio>
using namespace std;
int n,m,f=1,g=1;
int main(){
scanf("%d%d",&n,&m);
while (n){
int num=n%10; n/=10;
if (num>m) g=(m+1)*f; else g+=num*f;
f*=(m+1);
}
printf("%d",g-1);
return 0;
}