做该题时,发现有大数会进行取模运算,有点好奇原因。
因运算的不断累积,导致结果超过了 int32 甚至 int64 的取值范围。
当一个问题只对答案的正确性有要求,而不在乎答案的数值,可能会需要将取值很大的数通过求余变小(保证其数值在int类型范围内)。
求余运算规则:
设正整数x,y,p,求余符号为⊙。
对于加法运算:(x+y)⊙p = (x⊙p+y⊙p)⊙p
对于乘法运算:(x*y)⊙p = [(x⊙p)*(y⊙p)]⊙p
p不仅可以是1e9+7, 也可以是1e9+9和998244353
选择的原因:
- 都是一个小于2的30次方的质数
- 类型为int,所有取模后的数相加必然不会溢出int
- 类型为long,所有取模后的数相乘必然不会溢出long
循环取余
每次操作时,就进行取余操作
快速幂取余
剑指 offer 16 数值的整数次方(快速幂法)_Y_M的博客-CSDN博客
参考
为什么很多题目都对1e9+7取模?_Tech in Pieces-CSDN博客