计算二进制数字范围内 1 的数量的算法

2024-02-24

所以我刚回来ACM 编程竞赛表现还不错,但有一个问题没有一支球队能解决。

问题。

从大于 0 的整数 N0 开始。令 N1 为 N0 的二进制表示形式中 1 的数量。因此,如果N0 = 27, N1 = 4。对全部i > 0,令 Ni 为二进制表示中 1 的数量Ni-1。这个数列总是收敛于一。对于任何起始数字 N0,令 K 为 i >= 0 的最小值,其中 N1 = 1。例如,如果 N0 = 31,则 N1 = 5、N2 = 2、N3 = 1,因此 K = 3。

给定一个连续数字范围和 X 值,该范围内有多少个数字的 K 值等于 X?

Input
输入中会有几个测试用例。每个测试用例将在一行中包含三个整数:LO HI X
在哪里LO and HI(1 LO <= HIX(0 X

Output
对于每个测试用例输出一个整数,表示范围内的整数个数LO to HI(包括)其 K 值等于输入中的 X。将每个整数打印在自己的行上,不带空格。不要在答案之间打印任何空行。

输入样本

31 31 3
31 31 1
27 31 1
27 31 2
1023 1025 1
1023 1025 2
0 0 0

样本输出

1
0
0
3
1
1

如果你们愿意,我可以包括我们的答案或我们的问题,因为查找小范围很容易,但我会首先给您一个提示,您的程序需要运行seconds不是分钟。我们有一个成功的解决方案,但没有一个有效的算法来使用类似于

48238 10^18 9

不管怎样,祝你好运,如果社区喜欢这些,我们还有更多我们无法解决的问题,这对你们来说可能是一些很好的脑筋急转弯。竞赛允许您使用 Python、C++ 或 Java——答案中这三个都可以接受。


因此,作为一个提示,我的教练说要考虑二进制数如何计数,而不是检查每一位。我认为这让我们更加接近。


我认为关键是首先了解 K 值的模式及其增长速度。基本上,你有:

K(1) = 0
K(X) = K(bitcount(X))+1 for X > 1

因此找到给定 K 的最小 X 值,我们看到

K(1) = 0
K(2) = 1
K(3) = 2
K(7) = 3
K(127) = 4
K(170141183460469231731687303715884105727) = 5

所以对于像这样的例子48238 10^18 9答案很简单就是 0。K=0 仅适用于 1,K=1 仅适用于 2 的幂,因此在感兴趣的范围内,我们几乎只会看到 K 值 2、3 或 4,而永远看不到 K >= 5

edit

好的,所以我们正在寻找一种算法来计算 LO..HI 值范围内 K=2,3,4 的值的数量,而无需迭代整个范围。因此,第一步是找到 bitcount(x)==i 范围内的值的数量,其中 i = 1..59(因为我们只关心 10^18 以内的值和 10^18

edit(再次修复为与 C89 兼容并适用于 lo=1/k=0)

这是一个 C 程序,用于执行我之前描述的操作:

#include <stdio.h>
#include <string.h>
#include <assert.h>

int bitcount(long long x) {
    int rv = 0;
    while(x) { rv++; x &= x-1; }
    return rv; }

long long choose(long long m, long long n) {
    long long rv = 1;
    int i;
    for (i = 0; i < n; i++) {
        rv *= m-i;
        rv /= i+1; }
    return rv; }

void bitcounts_p2range(long long *counts, long long base, int l2range) {
    int i;
    assert((base & ((1LL << l2range) - 1)) == 0);
    counts += bitcount(base);
    for (i = 0; i <= l2range; i++)
        counts[i] += choose(l2range, i); }

void bitcounts_range(long long *counts, long long lo, long long hi) {
    int l2range = 0;
    while (lo + (1LL << l2range) - 1 <= hi) {
        if (lo & (1LL << l2range)) {
            bitcounts_p2range(counts, lo, l2range);
            lo += 1LL << l2range; }
        l2range++; }
    while (l2range >= 0) {
        if (lo + (1LL << l2range) - 1 <= hi) {
            bitcounts_p2range(counts, lo, l2range);
            lo += 1LL << l2range; }
        l2range--; }
    assert(lo == hi+1); }

int K(int x) {
    int rv = 0;
    while(x > 1) {
        x = bitcount(x);
        rv++; }
    return rv; }

int main() {
    long long counts[64];
    long long lo, hi, total;
    int i, k;
    while (scanf("%lld%lld%d", &lo, &hi, &k) == 3) {
        if (lo < 1 || lo > hi || k < 0) break;
        if (lo == 0 || hi == 0 || k == 0) break;
        total = 0;
        if (lo == 1) {
            lo++;
            if (k == 0) total++; }
        memset(counts, 0, sizeof(counts));
        bitcounts_range(counts, lo, hi);
        for (i = 1; i < 64; i++)
            if (K(i)+1 == k)
                total += counts[i];
        printf("%lld\n", total); }
    return 0; }

对于 2^63-1 (LONGLONG_MAX) 以内的值,它运行得很好。 为了48238 1000000000000000000 3它给513162479025364957,这看起来确实合理

edit

给出输入

48238 1000000000000000000 1
48238 1000000000000000000 2
48238 1000000000000000000 3
48238 1000000000000000000 4

给出输出

44
87878254941659920
513162479025364957
398959266032926842

这些加起来是 999999999999951763,这是正确的。 k=1 的值是正确的(2^16 到 2^59 范围内有 44 个 2 的幂)。因此,虽然我不确定其他 3 个值是否正确,但它们肯定是合理的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算二进制数字范围内 1 的数量的算法 的相关文章

  • 如何在 Unity 中对齐“轨道”或模块化对象?

    我正在开发一个简单的游戏 用户可以在其中放置不同但模块化的对象 例如 轨道 道路等 我的问题是 当将一个物体靠近另一个物体时 如何匹配和放置不同的物体 我的第一种方法是为每个模块对象创建一个隐藏的子对象 一个盒子 并将其放在可以放置其他对象
  • 查找一个二维矩阵是否是另一个二维矩阵的子集

    最近我参加了一个黑客马拉松 我了解到一个问题 试图在 2d 矩阵中找到网格形式的模式 模式可以是 U H 和 T 并由 3 3 矩阵表示 假设我想展示 H 和 U 1 0 1 1 0 1 1 1 1 gt H 1 0 1 gt U 1 0
  • 如何提高洪水填充例程的性能?

    我正在我的应用程序中实现四路洪水填充 伪代码如下 Flood fill node target color replacement color 1 If the color of node is not equal to target co
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • 机器人探索算法

    我正在尝试为机器人设计一种算法 试图找到位于未知位置的旗帜 该旗帜位于一个包含障碍物的世界中 机器人的任务是夺取旗帜并将其带到他的基地 代表他的起始位置 机器人在每一步只能看到有限的邻域 他事先不知道世界是什么样子 但他有无限的内存来存储已
  • 数字求和的算法?

    我正在寻找一种数字求和的算法 让我概述一下基本原则 假设你有一个号码 18268 1 8 2 6 8 25 2 5 7 7 是我们的最终数字 它基本上是将整个数字中的每个数字相加 直到我们得到一个 也称为 核心 数字 它经常被命理学家使用
  • 从 r 中的多个列表创建二进制(存在/不存在)数据矩阵

    我有一系列不同长度的单独变量列表 字符串 我想将它们组合成一个数据帧以形成存在 1 不存在 0 矩阵 鉴于它们的长度不同 我什至不知道如何创建初始数据框 这是我的例子 data1 lt c a b c d e f data2 lt c e
  • 字符串的渐进单词组合

    我需要获得字符串的渐进单词组合 例如 这是字符串 输出 这是字符串 这是 这个字符串 是字符串 这 是 细绳 你知道类似的算法吗 我需要php语言 谢谢 这是解决您问题的简单代码 我将每个字符串递归地连接到数组中的其余字符串 string
  • 求一根棒可以切割的最大片数

    这是完整的问题陈述 给定一根长度为n的绳子 你需要找到最大的绳子数你可以让每一段的长度都在集合 a b c 中给定三个值a b c 我知道可以通过动态规划来实现最优解 但是 我还没有学过这个主题 我需要递归地解决这个问题 对于递归 主要的事
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 逐字遍历句子

    如何逐字遍历任何给定的句子 java中有内置函数吗 我不知道如何开始 像这样的事情 String sentence Your sentence here String words sentence split s splits by whi
  • O(n^2) 与 O (n(logn)^2)

    时间复杂度是O n 2 or O n logn 2 better 我知道当我们简化它时 它就变成了 O n vs O logn 2 and logn lt n 但是关于logn 2 n is only less than log n 2 f
  • 带有元数据的 scipy kdtree

    我目前正在寻找一种方法来构建几个 kd 树以快速查询一些 n 维数据 但是 我对 scipy KD 树算法有一些问题 我的数据包括id gt data somedata coordinate x y 我希望能够基于坐标和 k 最近邻居的 i
  • 使用 stl sort 对表进行排序

    我有一个巨大的表 约 50Gb 格式为 i j k 来自稀疏矩阵 存储为 uint32 t idx1 idx2 float vals uint32 t tablesize 我想使用给定的比较函数 即 idx1 和 idx2 的函数 对其进行
  • 如何使用networkx删除有向图中的所有相关节点?

    我不确定我的问题的正确术语是什么 所以我只会解释我想做的事情 我有一个有向图 删除节点后我希望所有独立相关的节点也被删除 这是一个例子 假设我删除节点 11 我希望节点 2 也被删除 在我自己的示例中 它们将是 2 以下的节点 现在也必须删
  • 如何确定字符串的最小公约数?

    我在面试时被问到以下问题 并被它难住了 我遇到的部分问题是要下定决心要解决什么问题 起初我并不认为这个问题在内部是一致的 但后来我意识到它要求你解决两个不同的问题 第一个任务是弄清楚一个字符串是否包含另一个字符串的倍数 但第二个任务是在两个
  • 加权图的 BFS 算法 - 寻找最短距离

    我看过很多帖子 即 post1 https stackoverflow com questions 30409493 using bfs for weighted graphs post2 https cs stackexchange co
  • 打印从 1 到 100 的质数

    此 C 代码打印出以下素数 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 但我不认为这就是我的书所希望的写作方式 它提到了一些关于数字的平方根的内容
  • 有人还在使用客户端服务器架构吗[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我编写软件已有几十年了 现在一切都是网络 在网络出现之前 我们拥有的客户端服务器应用程序基本上是直接与数据库对话的胖客户端应用程序 它
  • CSR 矩阵 - 矩阵乘法

    我有两个方阵A and B 我必须转换B to CSR Format并确定产品C A B csr C 我在网上找到了很多关于CSR 矩阵 向量乘法 http www mathcs emory edu cheung Courses 561 S

随机推荐

  • MSVC10 Visual Studio 2010 是否支持基于 C++ 范围的循环

    MSVC10 是否支持 C 0x 草案标准的基于范围的循环 http en wikipedia org wiki C 2B 2B0x Range based for loop http en wikipedia org wiki C 2B
  • Jenkins Email-ext 预发送脚本

    我想在 Email ext Jenkins 插件的预发送脚本中编辑电子邮件正文 我应该使用什么语言来编写代码 Bash 脚本还是其他 您可以添加一些代码吗 谢谢 您必须使用的语言是 Groovy 您可以在 Jenkins gt 管理 gt
  • 使用 typeScript 滚动到 webView 上的 x,y 坐标

    我正在我的应用程序中制作自定义地图 这本质上是一个大地图图像 我根据 GPS 位置在大地图图像上移动一个小头像图像 我允许用户滚动地图以查看屏幕外的地方 我现在想添加一个按钮 使用户回到他们的位置中心 但它不起作用 我尝试使用 window
  • 如何获取带有分隔符的字符串的前五个字符

    由此形成一整串 1 2 3 4 5 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 我怎样才能实现像这样放入数组 我想将它们按行放入数组中 正如您所提到的 您可以将结果作为字符串 并具有预期结果row str
  • 无法在 Databricks 上运行 Pandas 分析

    我正在尝试在 Databricks 环境中的示例数据帧上运行 Pandas 分析 收到与 marplotlib 相关的错误 不确定此问题是否与 Matplotlib 或 pandas profiling 相关 任何帮助将不胜感激 Datab
  • 初始化 MIDIMetaEvent 结构

    我正在努力使用 swift 初始化 MusicPlayer h 中找到的 MIDIMetaEvent 结构 头文件定义结构如下 struct MIDIMetaEvent var metaEventType UInt8 var unused1
  • 将 Gollum wiki 部署到 Heroku

    Gollum 是 一个简单的 由 Git 驱动的 wiki 具有出色的 API 和本地前端 它托管在 GitHub 上 http github com github gollum http github com github gollum
  • 移动浏览器中 Div 绝对定位的问题

    我在以下网站上绝对定位名为 id verticalGenesis 的 div 时遇到很多问题 http genesispetaluma com index html http genesispetaluma com index html在移
  • 清理项目、重建项目、在 Android Studio 中运行项目

    有谁知道或知道 android studio 中这三个功能如何工作的详细答案 我认为 Eclipse 可能还有 IntelliJ 也具有相同或相似的功能 我已经看到并被告知答案 这些答案给出了它们如何工作的简要概述 据我了解 重建还将清理项
  • Printf 函数格式化程序

    有以下简单的C 代码 include
  • 在 MVC 中,您在哪里放置对模型类的引用?

    在询问了不同的人并且没有人提供我所说的 至少有点具体的答案 之后 我一直想知道 问题 在 iPhone 应用程序中 应用程序应该保留对其模型类的引用 使用MVC http developer apple com iphone library
  • 如何根据 Haskell 中的区域设置格式化数字?

    在Python中我可以使用locale format根据区域设置漂亮地打印数字 gt gt gt import locale gt gt gt locale setlocale locale LC ALL en US UTF 8 en US
  • 在 ASP.NET MVC 3 中缓存数据

    我有一个 ASP NET MVC 3 应用程序 它基本上只是一组 Web 服务 这些 Web 服务由一组控制器操作公开 每个控制器操作都会查询我的数据库 因为我的数据很少发生变化 而且陈旧的数据也不用担心 所以我想我应该实现一些缓存来提高性
  • Reactjs 笑话 jQuery 未定义

    我正在使用 jest 来测试我的reactJS 组件 在我的reactJS组件中 我需要使用jquery UI 所以我在组件中添加了以下内容 var jQuery require jquery require jquery ui ui co
  • scala 中的 <:< 运算符

    任何人都可以提供一些详细信息 lt
  • 在 SkiaSharp 中绘制旋转文本

    如何绘制旋转文本SkiaSharp 目前我正在旋转SKCanvas 绘制文本然后将其旋转回来 但我认为可能有一种更有效的方法来做到这一点 canvas RotateDegrees 45 20 20 canvas DrawText Text
  • Onclick 不触发

    我的母版页上有一组按钮 我已附加下面的代码 但没有引发 onclick 事件 我提取了最终页面源代码 但没有出现 onclick 事件 正如你所看到的 我尝试了几种不同的方法来解决这个问题 我正在寻找到服务器的正常回发 但当我单击这些按钮中
  • 使用 JSONpath 从 JSON 文件中提取叶子

    我有来自 REST API 的 JSON 输出 输出如下所示 sprints id 10516 sequence 10516 name SP121 BRK relief state CLOSED linkedPagesCount 0 id
  • Ansible:regex_search 过滤器比较以及如何调试 when 子句

    今天我花了一些时间尝试编写一些 Ansible 脚本 以便仅在相关命令输出中不存在相应行的情况下运行命令 经过一番尝试和错误后 我得到了一些对我有用的东西 但我不清楚为什么我与空字符串的初始比较不起作用 这是一个演示我的问题的剧本 name
  • 计算二进制数字范围内 1 的数量的算法

    所以我刚回来ACM 编程竞赛表现还不错 但有一个问题没有一支球队能解决 问题 从大于 0 的整数 N0 开始 令 N1 为 N0 的二进制表示形式中 1 的数量 因此 如果N0 27 N1 4 对全部i gt 0 令 Ni 为二进制表示中