讨论(xia che ≖‿≖✧)magic number——1000000007
为什么要对1000000007取模(取余)
来看这篇博客的基本上都是和我一样脑子有坑的人,要么就是看了我某篇大数阶乘,大数的排列组合等类似博客被忽悠过来的。我刚刚说到那些类型的题目一般都要求将输出结果对1000000007取模(取余)
为什么总是1000000007呢= _= ?
我估计啊因该是这几个原因:
- 1000000007是一个质数(素数),对质数取余能最大程度避免冲突(《离散数学》数论部分)
- int32位的最大值为231-1=2147483647,所以对于int32位来说1000000007足够大,不要问我为什么是31次方。
- int64位的最大值为2^63-1 = 18446744073709551616,对于1000000007来说 10000000072 = 1000000014000000049 不会在int64中溢出
- 算法题是要检查答案的,可以在最大可能的情况下避免测试点答案冲突。
所以在大数相乘的时候,因为(a∗b)%c=((a%c)∗(b%c))%c,所以相乘时两边都对1000000007取模,再保存在int64里面不会溢出,大概就是酱紫撒,更详细的我也懵啦,想不出来啦。
大道五十,天衍四九,人遁其一!