在cpp中除以大数字时查找大二进制字符串的剩余部分

时间:2018-05-25 14:20:46

标签: c++ stl c++14

我正试图解决hackerrank上的“两个设置位”问题。 问题链接:link

基本上我有一个二进制的大字符串,并希望除以余数 这个:1000000007。

我使用bitset数据类型进行求解,当我将字符串转换为long long int时,to_ullong()导致溢出。

无论如何都要摆弄字符串的位以获得余数?

1 个答案:

答案 0 :(得分:0)

当声明不公开时,很难回答你的问题。 但是,使用我的心灵能力,我猜你的问题是如何知道任意长位序列的余数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

对于低于K的2的幂,计算很容易。对于其他人,您应该再次使用模数属性:

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次。