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