$Problem’s$ $Website$
(没有权限查看题目的同学不要打我)
$Solution$
这道题是一道 思想 + 码农 题,很不错。
题意清楚明了,但做法却十分复杂。。。
根据数据范围$n \le 50$,我们得出结论——要用高精度计算。
因为有前导$0$ 的存在,所以对于$k\ =\ 0$时要单独讨论。
下面详细说一下做法。
- $k\ =\ 0$
当$k\ =\ 0$时,我们发现,只要有一位是$0$就符合要求,对于$n$位数,根据乘法原理,一共有$\prod\limits_{i=1}^{n}{10}$种方案数,其中不包含$0$的有$\prod\limits_{i=1}^{n}{9}$种,所以答案作差即可。
- $k\ \neq\ 0$
当$k\ \neq\ 0$时,我们考虑进行$dp$,不难得出状态$f[i][j]$为第$i$位组成$j$的方案数,然而观察数据范围,我们发现$k \le 10^9$,那么这样是定义不了数组的,于是我们想改善,我们可以把$k$分解因数,$f[i][j]$为第$i$位由第$j$个因数所能组成数的方案数,首先用一个数组存因数并且进行排序,然后第一遍枚举位数,第二遍枚举因数个数,第三遍枚举$1-9$(因为一位最多到$9$,用这些数去$\times$当前循环到的因数来转移状态),如果当前乘出来的数也是一个因数,那么$f[i + 1][temp]\ += \ f[i][j];$,最后答案即为$f[n][cnt]$($cnt$为因数个数)。
最后再次强调,这道题要写高精度!!!
同时注意定义变量的细节!!!
$Code$
1 |
|
$rp++$