0x3F 3F 3F 3F 有兩個特性數組
一、整數的兩倍不超過 0x7F FF FF FF,即 int 能表示的最大正整數.ide
二、整數的每 8 位(每一個字節)都是相同的。spa
須要考慮溢出的問題,以防止超過整數所能表示的最大範圍,在表達式中,是按照最高的數據類型來保持中間變量的,與最後保存的變量數據類型無關。code
1 int power (int a, int b, int p) { 2 int ans = 1 % p; 3 while (b) { 4 if (b & 1) ans = (ans * a) % p; 5 a = (a * a) % p; 6 b >>= 1; 7 } 8 return ans; 9 }
方法一:b 用二進制表示.和快速冪的相似。blog
1 int mul_1 (int a, int b, int p) { 2 int ans = 0; 3 while (b) { 4 if (b & 1) ans = (ans + a) % p; 5 a = (a * 2) % p; 6 b >>= 1; 7 } 8 return ans; 9 }
方法二: (a * b) mod p = (a * b) - (a * b / p) * pit
1 int mul_2 (int a, int b, int p) { 2 a = a % p; 3 b = b % p; 4 int c = a * b / p; 5 int ans = a * b - c * p; 6 if (ans < 0) ans += p; 7 else if (ans >= p) ans -= p; 8 return ans; 9 }
是將一個長度爲 m 的 bool 數組用一個 m 位的二進制整數表示並存儲。例如 STL 中的 bitset.event
一、取出整數 n 在二進制表示下的第 k 位 (n >> k) & 1class
二、取出整數 n 在二進制表示下的第 0 ~ k-1 位 (n) & ((1 << k ) - 1)變量
三、把整數 n 在二進制的表示下的第 k 位取反 n xor (1 << k)cli
四、把整數 n 在二進制表示下的第 k 位賦值 1 n | (1 << k)
五、把整數 n 在二進制表示下的第 k 位賦值 0 n & (~(1 << k))
if (n % 2 == 0) n xor 1 = n + 1
else n xor 1 = n - 1
lowbit(n) 取出非負整數 n 在二進制表示下最低位的 1 以及它後邊的 0 構成的數值
lowbit(n) = n & (~n + 1) = n & (-n)