1e9+7 对于计算机来说意味着什么
出现场景
最近做LeetCode,发现很多关于数值计算的问题,在最后都要将结果%1e9+7。于是就好奇为什么要模这个值?别的值不行吗?
1e9+7是一个质数
对于计算机来说,109+7是一个常用的模数,在涉及大规模运算的算法中经常使用它。这是因为数字109+7是一个质数,使用它作为模数有助于确保计算的中间结果保持小并且易于管理。执行任何在109+7上取模的计算都会产生一个在0到109+6之间的结果。
为什么要用1e9+7作为mod值
首先,c/c++在数据的处理中会有溢出和精度的问题,取模运算应运而生。
其次,取任意值x,当x % (1e9 + 7)的结果范围是介于[0~(1e9+7)]之间的。
当一个问题只对答案的正确性有要求,而不在乎答案的数值,可能会需要将取值很大的数通过求余变小
这个区间范围内的值对于计算机在数据精度和防止溢出问题上都是完全没问题的。
别的质数值不行吗?
也行,但是在一些特例上会出现报错(防止你蒙对)。
但是1e9+7是一个“足够大”的质数,那么对于取模后的值介于[0~(1e9+7)]之间,将这个容错率大大降低。
那么为什么不是1e9+13?
这方面我同意参考csdn作者Arvin____的说法:这更像是一种约定俗成的结果,有点机器学习中归一化的味道。
再大一点行不行?比如1e10+7
举个例子:
int a=0x3f3f3f3f; int b=0xc0c0c0c0; 输出: a=1061109567 b=-1061109568
对于计算机中的正负无穷来说:
正无穷:0x3f3f3f3f
负无穷:0xc0c0c0c0
所以针对指数幂上再大就不行了
参考链接:
- http://t.csdn.cn/6FOuu
- https://stackoverflow.com/questions/9169167/need-help-in-mod-1000000007-questions
- https://blog.51cto.com/u_15067234/4216624