W03 2023-05-07 10:23 采纳率: 84.2%
浏览 48
已结题

一个关于C++的问题算法题

请问各位,怎么用时间复杂度最小的方法计算出 ∏ni=1popcount(i)模10000007的值(其中popcount(i)表示i二进制表示中1的个数)

  • 写回答

1条回答 默认 最新

  • 冰 焰 狼 2023-05-07 11:36
    关注

    可以使用动态规划来计算这个式子。设 $f_i=\prod_{j=1}^{i}\text{popcount}(j)$,则 $f_n$ 是我们要计算的答案。

    考虑如何利用 $f_{i-1}$ 来计算 $f_i$。对于一个数 $j$,如果 $j$ 的二进制表示中最后一位是 1,那么 $\text{popcount}(j)$ 就比 $\text{popcount}(j-1)$ 多 1;如果最后一位是 0,那么 $\text{popcount}(j)$ 就等于 $\text{popcount}(j/2)$。因此可以得到状态转移方程:

    $$
    f_i=
    \begin{cases}
    (2f_{i-1})\bmod 10000007, & i\bmod 2=0,
    (f_{i-1}+\text{popcount}(i))\bmod 10000007, & i\bmod 2=1.
    \end{cases}
    $$

    其中 $i\bmod 2$ 表示 $i$ 是否为偶数。

    初始状态为 $f_0=1$,可以从 $f_0$ 递推得到 $f_n$。时间复杂度为 $O(n)$。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月28日
  • 已采纳回答 5月20日
  • 创建了问题 5月7日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。