一、快速冪的模板** a^b%p:
#includeusing注意點:namespace
std;
intmain()
cout
}
1、轉換成long long型別可以直接乘1ll,作用與(long long)相同,範圍大概為10^19,int為2 147 483 647。
2、以2^7為例,7 = 4(2^2) + 2(2^1) + 1(2^0);二進位制形式為111,b&1為獲取最後一位是否為1,b>>=1捨棄最後一位。
3、如果測試資料為123456789 0 1,res=1沒有%p的話,那麼結果就是1,正確應為0,所以應該初始化res就%p,res = 1 % p。
4、memset(a, val, sizeof(a))把數值val(0x00~0xff)填充到陣列a的每個位元組上,乙個int占用4個位元組,所以用memset只能賦值出「每8位都相同」的int。0x3f3f3f3f(1 061 109 567)的兩倍不超過0x7f7f7f7f(2 147 483 647),memset(a, 0x3f, sizeof(a))。0xffffffff為-1。
二、如果a, b, p範圍是10^18,求a*b%p
1、那麼為了不超過範圍,首先得用usigned long long,2*10^19。乘法轉化為加法,a^b = a * a * …… * a。a * b = a + a + ……+a。
a * 1 = 2^0 * a,
a * 2 = 2^1 * a,
a * 4 = 2^2 * a,
a * 8 = 2^3 * a,
a * 2^k = 2^k * a。
一共k+1次,k為logb級別。
#includeusing最短hamilton路徑:namespace
std;
typedef unsigned
long
long
ull;
intmain()
cout
}
0x01 基本演算法 位運算
題目描述 求 a 的 b 次方對 p 取模的值,其中 0 a,b,p 10 9 輸入描述 三個用空格隔開的整數a,b和p。輸出描述 乙個整數,表示a b mod p的值。例項 輸入 2 3 9 輸出 8 思路 這道題是要先算出a的b次冪再對其結果進行求模 取餘 因為b最大可為1e 9,按普通做法來做...
閱讀筆記 0x01 位運算
1.補碼表示 x 1 x 2.自然溢位 unsigned long long 自動對2 32取模,可以用來hash。3.基本位運算操作 左移 1 n 1 2n,n 2 4n,n 3 8n。算術右移 n 1 n 2 n 4 n 16。算術右移 除以2向下取整 e.g.3 1 2,3 1 1 p.s.整...
關於彙編 0x01記憶體
記憶體,與記憶體條不是乙個概念。在計算機中,每個程序都有自己的4gb記憶體空間,這個4gb的記憶體空間並不是真實的,而是系統分配的虛擬記憶體。虛擬記憶體 物理記憶體 記憶體條等其它硬體裝置 板卡記憶體 物理記憶體是用來跟硬體記憶體互相對映的,跟記憶體條的大小也不是一一對應的。如何通過虛擬記憶體如何找...