大數階乘,大數的排列組合等,一般都要求將輸出結果對1000000007取模
為什麼總是1000000007呢?
1、大數求餘原因:大數越界
大數越界:隨著n增大,f(n)會超過int32甚至int64的取值範圍,導致最終的返回值錯誤。
當乙個問題只對答案的正確性有要求,而不在乎答案的數值,可能會需要將取值很大的數通過求餘變小。
2.int32位取值範圍是-2147483648~2147483647,1000000007 是最小的十位質數。模1000000007,可以保證值永遠在int的範圍內。
3.int64位的最大值為2^63-1,對於1000000007來說它的平方不會在int64中溢位
所以在大數相乘的時候,因為(a∗b)%c=((a%c)∗(b%c))%c,所以相乘時兩邊都對1000000007取模,再儲存在int64裡面不會溢位
為什麼oj刷題要對1000000007進行取模運算
最近在oj中,在博主提交斐波那契數列解答時,這是第一版的 private static int fib int n int arr new int n 1 arr 1 1 return fib2 n,arr private static int fib2 int n,int arr if arr n...
為什麼要模1000000007
先看一下常用資料型別的數值範圍 32位系統 位元組 型別 範圍 長度 位元組型別 範圍長度 一位元組 2 8 char 128 127 3一位元組 2 8 unsigned char 0 255 3二位元組 2 16 short 32768 32767 5二位元組 2 16 unsigned sho...
什麼是對齊,為什麼要對齊
什麼是對齊,以及為什麼要對齊 現代計算機中記憶體空間都是按照 byte 劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因...