快速求popcount的和
前置知识#
结论#
其中
原理#
首先我们需要知道这个东西:
__builtin_popcount(x)
可恶怎么又是 STL
他的作用就是求出
接下来我们考虑用
的做法。
这里以
先把所有的数都给列出来。
然后我们可以看到最低位的规律。
依次向后走。
我们可以看到每一位里面都是一半是
因此我们可以得到下面的公式:
下面以
其第一位为
其第二位为
其第三位是
其第四位为
其第五位是
其第六位为
其第七位为
其第八位是
但其实我们只需要处理
最后再加上
最终结果就是:
因为
代码#
scanf("%d", &n);
long long tot = 0;
int cnt = 0;
int x = n;
while(x)
{
if(x & 1)
tot += (cnt * (1 << (cnt - 1))) + (1 << cnt) * __builtin_popcount(x >> 1);
x >>= 1;
cnt++;
}
tot += __builtin_popcount(n);
printf("%lld ", tot);
转载自:https://kaiserwilheim.github.io/OI/fast-popcnt-sum/
虽然是转载但是
作者: 北烛青澜
出处:https://www.cnblogs.com/Multitree/p/17206752.html
本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话