快速求popcount的和
前置知识
\(\text{popcount}(n)\) 表示将 \(n\) 转为二进制后的数中 \(1\) 的个数。
结论
\]
其中 $ \left [ (n>>(i-1))\text{&}1==1 \right ]$ 表示 \(n\) 转成二进制以后第 \(i\) 位是不是 \(0\)。
原理
首先我们需要知道这个东西:
__builtin_popcount(x)
可恶怎么又是 STL
他的作用就是求出 \(x\) 的 \(\text{popcount}\) 值,这个东西好像很快我们先把他当作 \(O(1)\) 的。
接下来我们考虑用 \(O(1)\) 的时间来求得
\]
的做法。
这里以 $ \left [ 0,2^{5}-1 \right ] $ 为例。
先把所有的数都给列出来。

然后我们可以看到最低位的规律。

依次向后走。




我们可以看到每一位里面都是一半是 \(0\),一半是 \(1\)。
因此我们可以得到下面的公式:
\]
下面以 \((11010110)_{2}=(214)_{10}\) 为例。
其第一位为 \(1\),所以我们直接计算 \((00000000)_{2}\text{~}(01111111)_{2}\) 的 \(\text{popcount}\) 和,也就是 \(0\times 2^{7}+7\times 2^{6}\)。
其第二位为 \(1\),所以我们直接计算 \((10000000)_{2}\text{~}(10111111)_{2}\) 的 \(\text{popcount}\) 和,也就是 \(1\times 2^{6}+6\times 2^{5}\)。
其第三位是 \(0\),对答案没有贡献。
其第四位为 \(1\),所以我们直接计算 \((11000000)_{2}\text{~}(11001111)_{2}\) 的 \(\text{popcount}\) 和,也就是 \(2\times 2^{4}+4\times 2^{3}\)。
其第五位是 \(0\),对答案没有贡献。
其第六位为 \(1\),所以我们直接计算 \((11010000)_{2}\text{~}(11010011)_{2}\) 的 \(\text{popcount}\) 和,也就是 \(3\times 2^{2}+2\times 2^{1}\)。
其第七位为 \(1\),所以我们直接计算 \((11010100)_{2}\text{~}(11010101)_{2}\) 的 \(\text{popcount}\) 和,也就是 \(4\times 2^{1}+1\times 2^{0}\)。
其第八位是 \(0\),对答案没有贡献。
但其实我们只需要处理 \([0,n)\) 这个区间分段即可。
最后再加上 \(\text{popcount}((11010110)_{2})=5\)。
最终结果就是:
\]
\]
\]
因为 \(\text{popcount}(0)=0\),所以统计不统计都可以。
代码
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/
虽然是转载但是 \(\LaTeX\) 都是我自己打的QAQ
快速求popcount的和的更多相关文章
- 快速求n的质因子(数论)
快速求n的质因子 如何尽快地求出n的质因子呢?我们这里又涉及两个好的算法了! 第一个:用于每次只能求出一个数的质因子,适用于题目中给的n的个数不是很多,但是n又特别大的 #include<std ...
- 【GDOI 2011 DAY2 T3】零什么的最讨厌了 (快速求阶乘、中国剩余定理)
问题描述: 林记在做数学习题的时候,经常遇到这种情况:苦思冥想了很久终于把问题解出来,结果发现答案是0,久而久之林记在得到习题答案是0的时候就没有了做出一道难题的成就感.于是林记决定:以后出题,答案一 ...
- 快速求幂(Quick Exponentiation)
接触ACM没几天,向各路大神求教,听说ACM主要是研究算法,所以便开始了苦逼的算法学习之路.话不多说,RT所示,学习快速求幂. 在头文件<math.h>或是<cmath>中,d ...
- hdu 2814 快速求欧拉函数
/** 大意: 求[a,b] 之间 phi(a) + phi(a+1)...+ phi(b): 思路: 快速求欧拉函数 **/ #include <iostream> #include & ...
- NYOJ--102--次方求模(快速求幂取模)
次方求模 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 求a的b次方对c取余的值 输入 第一行输入一个整数n表示测试数据的组数(n<100)每组测试只有一 ...
- javascript中快速求数组的全部元素的相加之和
js中快速求数组的全部元素的相加之和: var arr = [1,2,3,4,5];var sum = eval(arr.join('+')); console.log(sum); 运行结果: 15
- HDU 2035 人见人爱A^B(二分求幂,快速求幂)
题意:求A的B次方的后三位数字 思路1:常规求幂,直接取余求解 代码: #include<iostream> #include<cstdio> using namespace ...
- 快速求排列C(m,n)加取模
快速求排列组合C(m,n)%mod 写在前面: 1. 为防止产生n和m的歧义,本博文一律默认n >= m 2. 本博文默认mod = 10^6+3 3. 本博文假设读者已知排列组合公式 C(m, ...
- 线性齐次递推式快速求第n项 学习笔记
定义 若数列 \(\{a_i\}\) 满足 \(a_n=\sum_{i=1}^kf_i \times a_{n-i}\) ,则该数列为 k 阶齐次线性递推数列 可以利用多项式的知识做到 \(O(k\l ...
- Quick Pow: 如何快速求幂
今天讲个有趣的算法:如何快速求 \(n^m\),其中 n 和 m 都是整数. 为方便起见,此处假设 m >= 0,对于 m < 0 的情况,求出 \(n^{|m|}\) 后再取倒数即可. ...
随机推荐
- 读取远程服务器linux指定目录下文本内容(工具类)
package com.aa.dataadmin.common.utils; import cn.hutool.extra.ssh.JschUtil; import com.jcraft.jsch.C ...
- python内置函数range()—对象创建函数
range()函数 介绍 range()函数实际上表示一个不可变的数字序列类型,通常用于在for循环中指定特定的次数. range()的格式: range(stop) range(start, sto ...
- [WinUI 3] 如何利用D3D11在SwapChainPanel控件上绘制OpenGL(Uwp通用)
预览 技术实现 看过我上篇在 WPF 中实现 OpenGL 与 D3D 渲染的同学应该知道,我是依靠 WGL 中 WGL_NV_DX_interop 扩展与 D3D Surface 关联并在使用该 S ...
- MS SQL Server 删除重复行数据
您可以使用以下 SQL 语句删除 MS SQL Server 表中重复的行: WITH CTE AS ( SELECT ROW_NUMBER() OVER(PARTITION BY column1, ...
- 3分钟带你了解Hadoop是什么
Hadoop是一种开源的分布式计算框架,它在Google的MapReduce论文发表后大受欢迎,并被广泛应用.Hadoop框架包括一个分布式文件系统(HDFS),它允许用户以分布式方式存储和管理大量数 ...
- CPU 100%问题排查总结
更多内容,移步IT-BLOG 排查思路 [1]定位高负载进程 pid:登录进服务器使用 top 或 top -c命令[ps -ef | grep xxx 命令]查看当前 CPU消耗过高的进程,从而得到 ...
- CSAPP-Attack Lab
目录 Code Injection Attacks Level 1 Level 2 Level_3 Return-Oriented Programming Level_4 Level_5 获取栈顶地址 ...
- VUE百度地图API调用(手机端、PC端、微信通用)
百度地图API-示例中心: https://lbsyun.baidu.com/jsdemo.htm#aCreateMap 1.引入百度地图(此处用到的是V2.0版本) 1> 建立一个js文件,例 ...
- Rancher(V2.6.3)安装K8s教程
Rancher(V2.6.3)安装K8s教程 一,安装前环境准备: 1,升级Linux服务器内核 Ubuntu20.04: #查看当前内核版本 uname -rs #查看软件库中可下载的内核 sudo ...
- 在k8s安装CICD-devtron
在k8s安装CICD-devtron 先前条件 <kubernetes(k8s) 存储动态挂载>参考我之前的文档进行部署https://www.oiox.cn/index.php/arch ...