c++ - 在cpp中除以大数时查找大二进制字符串的余数
问题描述
我正在尝试解决hackerrank 上的“两个设置位”问题。问题链接:链接
基本上我有一个大的二进制字符串,并且想要除以这个余数:1000000007。
我正在使用 bitset 数据类型进行求解,当我将字符串转换为 long long int 时,to_ullong() 会导致溢出。
有没有办法摆弄字符串的一部分来获得剩余部分?
解决方案
当声明不公开时,很难回答你的问题。但是使用我的精神力量,我猜你的问题是如何知道任意长位序列模的余数K = 1000000007
。
假设这确实是问题,您可以将您的位串记为:
b_0 b_1 ... b_n
其值为:
V = b_0*2^0 + b_1*2^1 + ... + b_n*2^n
鉴于您拥有的模运算的属性:
V % K = [ (b_0*2^0) % K + (b_1*2^1) % K + ... + (b_n*2^n) % K ] % K
对于低于 2 的幂,K
计算很容易。对于其他人,您应该再次使用模属性:
V*W % K = [ (v % K) * (W % K) ] % K
例如:
2^(1000) % K = [ (2^10) % K * ... * (2^10) % K ] % K
\_______________ __________________/
\/
100 factors
每个模数都很容易计算,而且比K
使其适合long long
.
总体复杂性将是O(n*log(n))
,因为您执行O(log(n))
操作来计算2^n % K
,并且您执行此操作n
。
推荐阅读
- python - 我正在尝试从给定的输入中删除长度小于等于 4 的文本。我正在使用 EasyOcr 和边界框概念
- android-11 - 无法在 Oxygen OS 11 的通讯录中保存姓名字段
- pytorch - Pytorch 中的 Mask R-CNN 优化器和学习率调度器
- objective-c - 关于 3DES 加密/TripleDES 不同导致 Objective-C 和 vb
- docker - 使用 Visual Studio 2019 右键单击将自定义 docker 图像发布到现有 ACR
- c# - 来自另一个程序集资源文件中的自定义用户控件的图像在我的项目中使用时不显示,但在 VS 设计器中显示正常
- mysql - Delete From in delete after trigger 不从另一个表中删除
- firebase - 是否每个 FireBase 云函数都创建自己的 Nodejs 函数应用程序中编写的所有代码的副本?
- python - Ttk 按钮按下时进度条不确定
- java - 我正在设计自定义标题栏。但标题栏不能覆盖所有屏幕。看看