CF2060F. Multiplicative Arrays

原题链接

题意

给定 \(n, k\), 求有多少个数组 \(a\), 使得 \(\displaystyle 1 \le |a| \le n, 1 \le a_i \le k, \prod_{i = 1}^{|a|} = x\), 其中 \(x \in [1, k]\)​.

算法

动态规划, 组合数学.

思路

注意到虽然 \(n\) 很大, 但 \(k \le 10^5\), 这意味着 \(k\) 的质因子个数不多于 \(\log_2 k\) 个, 也就是 \(17\) 个, 剩下的空肯定都是会填 \(1\) 的.

考虑计数. 令 \(f_{i, j}\) 表示当前序列乘积为 \(i\) 且长度为 \(j\) (其中每一个数均大于 \(1\)) 的方案数. 显然有转移方程 \(\displaystyle f_{i, j} = \sum_{p \mid i \and p > 1} f_{i / p, j - 1}\).

这样计算出 \(f\) 数组过后, 思考怎么计算答案. 再令 \(g_n\) 表示乘积为 \(n\) 的满足条件的数组个数, 那么有 \(\displaystyle g_n = \sum_{i = 1}^n \sum_{j = 1}^{16} \binom{i}{j} f_{n, j}\), 注意到 \(\displaystyle \sum_{i = 1}^n \binom{i}{j} = \binom{n + 1}{j + 1}\), 所以 \(\displaystyle g_n = \sum_{j = 1}^{16} \binom{n + 1}{j + 1} f_{n, j}\).

posted @   Steven1013  阅读(4)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示