為什麼要模1000000007

2022-04-30 11:57:12 字數 1314 閱讀 3284

先看一下常用資料型別的數值範圍(32位系統)

位元組 型別 範圍 長度

位元組型別

範圍長度

一位元組(2^8)

char

-128 ~ 127

3一位元組(2^8)

unsigned char

0 ~ 255

3二位元組(2^16)

short

-32768 ~ 32767

5二位元組(2^16)

unsigned short

0 ~ 65535

5四位元組(2^32)

unsigned int

0~4294967295

10四位元組(2^32)

int-2147483648~2147483647

10四位元組(2^32)

unsigned long

0~4294967295

10四位元組(2^32)

long

-2147483648~2147483647

10八字節(2^64)

long long (g++)

-9223372036854775808~9223372036854775807

19八字節(2^64)

unsigned long long (g++)

0~18446744073709551615

20八字節(2^64)

__int64 (msvc)

-9223372036854775808~9223372036854775807

19八字節(2^64)

unsigned __int64 (msvc)

0~18446744073709551615

20為什麼要取模,取模前後的值不就變了嗎?

確實:取模前 f(43) = 701408733, f(44) = 1134903170, f(45) = 1836311903, 但是 f(46) > 2147483647結果就溢位了。

對齊,取模後 f(43) = 701408733, f(44) = 134903163 , f(45) = 836311896, f(46) = 971215059沒有溢位。

1000000007是乙個質數(素數),對質數取余能最大程度避免衝突

int32位的最大值為2147483647,所以對於int32位來說1000000007足夠大。

int64位的最大值為2^63-1,對於1000000007來說它的平方不會在int64中溢位。

所以在大數相乘的時候,因為(a∗b)%c=((a%c)∗(b%c))%c,所以相乘時兩邊都對1000000007取模,再儲存在int64裡面不會溢位

Hash時取模為什麼要模質數

首先來說假如關鍵字是隨機分布的,那麼無所謂一定要模質數。但在實際中往往關鍵字有某種規律,例如大量的等差數列,那麼公差和模數不互質的時候發生碰撞的概率會變大,而用質數就可以很大程度上迴避這個問題。考慮模是合數的情況 假設n kn,m km,n和m存在最大公因數k,此時可以將n m r轉化為公式n mq...

為什麼要對1000000007取餘

大數階乘,大數的排列組合等,一般都要求將輸出結果對1000000007取模 為什麼總是1000000007呢?1 大數求餘原因 大數越界 大數越界 隨著n增大,f n 會超過int32甚至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...