ABC133F Small Products
考虑 DP。
状态
令
答案是
有递推
我们的目标是求出
先来解决状态表示的问题,也就是
注①:当
注②:关于上一段所说的“对于
递推
对于
由于
对于
容易证明下列几个不等式
只证第 3 个。
设 $ \floor{\frac{N}{i}} = t
因此我们有
若
,则
并且当时, 可表为
从而有
1.
2.
代码
int main() {
int n, k;
scan(n, k);
int r = sqrt(n + 0.5); // r is defined to be floor(sqrt{n})
vv<int> f1(k + 1, vi(r + 1)); // f1[len][i]:长为len,首项 <= i
vv<int> f2(k + 1, vi(r + 1)); // f2[len][i]:长为len,首项 <= n/i
up (i, 1, r) {
f1[1][i]=i;
}
up (i, 1, r) {
f2[1][i] = n / i;
}
up (l, 2, k) {
up (i, 1, r) {
f1[l][i] = f1[l][i - 1] + f2[l - 1][i];
if (f1[l][i] >= mod) {
f1[l][i] -= mod;
}
}
f2[l][r] = f1[l][n/(r + 1)] + (ll)(n / r - (n / (r + 1))) * f1[l - 1][r] % mod;
if (f2[l][r] >= mod) {
f2[l][r] -= mod;
}
down (i, r - 1, 1) {
f2[l][i] = f2[l][i + 1] + (ll)(n / i - (n / (i + 1))) * f1[l - 1][i] % mod;
if (f2[l][i] >= mod) {
f2[l][i] -= mod;
}
}
}
println(f2[k][1]);
return 0;
}
从另一个角度看待这个问题。以下所有 / 运算都向下取整。
取一个数字 m,求出 f[L][1..m]
f[L][i] = f[L][i-1] + f[L-1][N/i]
开一个数组 g[1..m],g[L][i] := f[L][N/i]
问题归结为如何计算 g[L][i]
上面已经得到
g[L][i] = g[L][i+1] + (L/i - L/(i+1))*f[L-1][i]
整个计算过程如下
for i = 1 to m
f[1][i] = i
g[1][i] = N/i
for L = 1 to K
f[L][0] = 0
for L = 2 to K
for i = 1 to m
f[L][i] = f[L][i-1] + g[L-1][i]
// compute g[L][m]
for i = m - 1 down to 1
g[L][i] = g[L][i+1] + (L/i - L/(i+1)) * f[L-1][i]
问题进一步归结为如何计算 g[L][m],即 f[L][N/m]
若 N/m <= m 则 f[L][N/m] 已经算出来了,不成问题。
若 N/m > m 但 N/(m + 1) <= m 则 f[L][N/m] = f[L][N/(m+1)] + (N/m - (N/(m+1))*f[L-1][m],也不成问题。
所以保险的办法是取 m 使得 N/(m + 1) <= m,取 m = floor(sqrt(N)) 就可以保证 N/(m+1) <= m。证明:m+1 > sqrt(N) 因此 N/(m+1) < sqrt(n) <= m 。
取 m = floor(sqrt(N)) + 1 可以保证 N / m < m。证明 m > sqrt(N),所以 N / m < sqrt(N) <= floor(sqrt(N)) < m。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 用一种新的分类方法梳理设计模式的脉络