Fenwick Tree解波序列问题中 (b+1e9+7)%1e9+7 操作的作用是什么?
关于代码中
b=(b+mod)%mod语句的作用 这行代码的核心作用是修正模运算后的负数结果,保证b的值始终落在[0, mod-1]的合法正余数区间,具体原因如下:
- 先看b的计算逻辑:
long long b=(query(100000,1,bit)+query(100000,2,bit))%mod-query(x,1,bit)-query(x,2,bit);
所有query函数的返回值都是已经对mod=1000000007取模后的结果,取值范围固定为[0, 1000000006]。前半部分求和后也做了取模处理,同样落在[0, 1000000006]区间。当前半部分的取值小于后面两个query返回值的和时,计算得到的b就会是负数。 - C/C的模运算规则中,负数对正数取模的结果符号与被除数保持一致,例如
(2 - 5) % 7在C中会得到-3,而不是模运算场景下我们需要的正余数4。如果直接用负数参与后续的ans累加、树状数组更新操作,就会导致计数结果错误,这就是不加这行代码无法通过全部测试用例的核心原因。 - 先加mod再取模的设计刚好能解决这个问题:
因为b的最小可能值为0 - 1000000006 - 1000000006 = -2*1000000007 + 2,加一次mod后b的取值范围就变成了[-1000000005, 2*1000000006],再做一次mod运算,就可以保证最终结果一定是[0, 1000000006]区间的正余数。如果b本身就是正数,加mod再取模的操作不会改变b的原有取值,不会影响正常计算。
内容的提问来源于stack exchange,提问作者AVIRAL KHANDUJA
相关产品推荐
相关产品推荐

