首页 > 其他分享 >trick : Trygub num

trick : Trygub num

时间:2023-08-05 23:55:52浏览次数:37  
标签:NOI2017 测试点 Trygub 30 整数 trick num leqslant

trick大意

我对于这个trick的理解为:支持位运算的高精度
维护一个以 \(b\)为基数的大数 \(N\),并支持以下功能:

  • 给定(可能是负)整数 \(|x|, |y| \leqslant n\),将 \(x b^y\)加到 \(N\)。
  • \(N \geqslant 0\)时,给定\(k\),打印\(N\)的第\(k\)位数字(指以\(b\)为基底意义下的)。
  • 检查\(N\)是正值、负值还是等于\(0\)。

操作 \(O(\log n)\)均摊时间复杂度和 \(O(q)\)内存。并且只需要map进行实现,相比于线段树等数据结构维护非常的好写。

例题及实现 : [NOI2017] 整数

题意简述 : 一个整数\(x\),进行\(n\)次操作,分为两种:

  • 将 \(x\) 加上整数 \(a\cdot 2^b\),其中 \(a\) 为一个整数,\(b\) 为一个非负整数

  • 询问 \(x\) 在用二进制表示时,位权为 \(2^k\) 的位的值(即这一位上的 \(1\) 代表 \(2^k\))

保证在任何时候,\(x\geqslant 0\)。

  • 对于所有测试点,满足 \(|a| \leqslant 10^9\);
  • 对于所有测试点,满足 \(0 \leqslant b, k \leqslant 30n\);
  • 对于所有测试点,满足 \(n \leqslant 1000000\)

这里我们的基底为\(2^{30}\),感性理解一下:把\(x\)的二进制表示分为若干段,每一段长是\(30\)位,这样每次我们只需要改动最多两段,分别对这两段将原数字位运算为相应位后直接加到数中,多于\(2 ^ {30}\)的进行进位操作。

发现其实很像一个\(2^{30}\)进位制,这也是以\(b\)为基底的真正含义

关于均摊时间复杂度

其实我不是很能证明,但是再次感性理解,就是假设一些段内的数为\([2^{30} - 1,2^{30} - 1,2^{30} - 1,2^{30} - 1...]\) 即对应二进制内全为\(1\)。
显然加一次,他就会往后进很多位花大量时间,虽然这一次花了很多时间,但是呢,需要进位的次数其实是很少的,而不需要进位的时候,直接加又很快,这样下来我们的均摊时间就不是那么慢了。

代码

先咕,急的看参考资料。

习题

参考资料

如果英语还不错,可以直接看原CF博客:
Big integers with negative digits: The Trygub numbers

CF原作者的[NOI2017] 整数提交记录

标签:NOI2017,测试点,Trygub,30,整数,trick,num,leqslant
From: https://www.cnblogs.com/six-one/p/17608886.html

相关文章

  • 【Python】numpy_科学计算的基础库
    简介Numpy中的数组的存储效率和输入输出性能均优于Python中等价的基本数据结构Numpy是一个开源的Python的科学计算库,用于快速处理任意维度的数组。 Numpy支持常见的数组及矩阵的操作,对于同样的计算任务有着比Python更简洁的指令和更高效的算法。Numpy使用na......
  • 【银河麒麟V10】【服务器】numa技术
    【银河麒麟V10】【服务器】numa技术桂安俊@kylinOS已于2022-10-1422:00:49修改2807收藏13分类专栏:#服务器操作系统版权服务器操作系统专栏收录该内容26篇文章42订阅订阅专栏目录1、numa介绍2、numa工具安装3、numa查看4、numa测试5、numa打开与关闭6、补充:服务器SMP......
  • numpy
    concatenate(vstack列方向和hstack行方向)numpy.concatenate((a1,a2,...),axis=0) 其中:a1,a2,....:待合并的数组axis:沿着数组合并的维度,默认为0(对于二维数组来说,默认沿着行的方向进行合并)这里需要注意a1,a2,...待合并的数组除了待合并的维度,其余维度上的值必......
  • Jenkins:重置 job build number
    在调试jenkinsjob时会产生很多fail的build,很多红色的X还是很碍眼的,job调试成功后就可以重置buildnumber了。步骤:点击jenkins小老头图标->管理Jenkins在管理Jenkins页面找到ToolsandActions->scriptsconsole工具运行下面代码defjobName="需重置build号......
  • Numpy,一篇足以
    numpy用于数值计算ndarray,一个有效的多维数组,能提供以数组为导向的快速数值计算和灵活的广播功能(broadcasting)便利的数学函数用于读取/写入(reading/writing)数据到磁盘的便利工具线性代数,随机数生成,傅里叶变换能力可以用CAPI来写C,C++,或FORTRANndarrayN-dimension......
  • [GUET-CTF2019]number_game
    [GUET-CTF2019]number_game  打开题目,立刻定位关键函数for(i=0;i<=4;++i){for(j=0;j<=4;++j){for(k=j+1;k<=4;++k){if(*(&unk_601060+5*i+j)==*(&unk_601060+5*i+k))......
  • numpy——广播机制
    Numpy的广播机制广播机制的三大原则:规则一:如果两个数组的维度不相同,那么小维度的张量的形状将会在最左边补1(添加轴)规则二:如果两个张量形状在任何一个维度上都不匹配,那么数组的形状会沿着维度为1扩展以匹配另一个张量的shape规则三:如果两个数组的形状在任何一个维度上都不匹配......
  • numpy-选择和过滤
    numpy-选择和过滤目录numpy-选择和过滤查找np,where()np.extract()比较数组和单个数字数组和数组过滤单条件过滤多条件过滤查找np,where()1、不带条件返回tuple,第一个值是索引,第二个是空值输入必须是数组,不能是list输入一般是一维,行向量或者列向量都可以2、带条件np.wh......
  • numpy-线代和矩阵
    numpy-线代和矩阵目录numpy-线代和矩阵创建(转换)矩阵矩阵运算np.linalg线代函数库np.matlib矩阵函数库参考资料创建(转换)矩阵一般我们先创建数组,然后将其转化为矩阵np.mat(data,dtype=None)data:数据或者数组dtype:数据格式importnumpyasnparr1=np.array(......
  • NUMA的结构
    NUMAhttps://houmin.cc/posts/b893097a/一个NUMANode内部是由一个物理CPU和它所有的本地内存(LocalMemory)组成的。广义上还包含本地IO资源,对大多数Intelx86NUMA平台来说,主要是PCIe总线资源。物理CPU:一个CPUSocket里可以由多个CPUCore和一个Uncore部分组成。每个CPUCo......