请问各位,怎么用时间复杂度最小的方法计算出 ∏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)$。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥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如何向数据库中添加自动生成的字段数据。