user
1 | 乘积之和 |
deepseek v4 flash
根据你的需求,这是一个计算 S(5×10^4) mod 999676999 的 C++ 代码。我按照你描述的思路实现:
- 筛法预计算 D 函数:利用质数筛和递推关系计算所有 D 值
- DP 计算分拆得分:限制转移时数字非递减(无序分拆)
- 累加得到结果:计算所有 G(n) 并求和得到 S(N)
1 |
|
这个代码的核心要点:
D 函数计算:
- 先用筛法找出所有质数,D(p) = 1
- 对合数 n = p × q(p 是质因子),递推:D(n) = D(p)×q + D(q)×p
DP 转移:
dp[sum]= 所有分拆的得分之和(即 G(sum))- 外层从小到大枚举数字
num,保证非递减顺序 - 内层完全背包正序更新:
dp[sum] += dp[sum - num] × D(num) - 这等价于:所有和为
sum-num的分拆,加上num后得分乘 D(num)
复杂度:
- D 函数预计算:O(N log log N)
- DP 计算:O(N²) ≈ 1.25×10^9,在现代 C++ 中可接受(约 10-30 秒)
- 空间:O(N)
运行后会输出 S(50000) mod 999676999 的值。这个算法完全符合你描述的无序分拆限制。
fun fact
一发过了.