设 c(x) 为满足 f(i)=x 即各位数字之积 =x 的 i 的个数。
那么变化之后格子 (x,y) 上有的金块个数就是 c(x)⋅c(y)。
容易发现 c(x) 中的 x 分解后若除了 2,3,5,7 还有其他质因子,c(x)=0。
问题就在于 c(x) 的求法,我们可以用数位 DP(个人喜欢记搜),状态需要记录搜到第 x 位,组成的数 =2a⋅3b⋅5c⋅7d 中的指数 a,b,c,d。
然后用一个常量数组记录一下 1−9 分解之后的四个指数,搜索的时候注意除了前导 0 的时候都不能选 0,以及所有位都是 0 时最后一位会算作前导 0 需要特判。
于是我们 DFS 一遍 n 以内的质因子只有 2,3,5,7 的数(或者直接枚举四个指数就行),求出其对应的 c 函数值,然后把所有的 c 函数值从大到小排个序。
然后我们设 c 函数值有 cnt 个,往大根堆里面丢 cnt 个形如 (x,1) 的二元组,大根堆的优先级是二元组两个数的 c 值之积。
从大根堆取出一个二元组,计算对答案的贡献,再把第二个数加一丢回去。这样执行 k 次就行了。
注意实现细节。
以及,不要问为什么我用 pbds 的优先队列。
代码:
1 |
|