我正试图解决hackerrank上的“两个设置位”问题。 问题链接:link
基本上我有一个二进制的大字符串,并希望除以余数 这个:1000000007。
我使用bitset数据类型进行求解,当我将字符串转换为long long int时,to_ullong()导致溢出。
无论如何都要摆弄字符串的位以获得余数?
答案 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
次。