問題:求 \(a\times b\bmod p\),\(a,b,p\) 在long long
範圍內。
在crt等演算法中應用廣泛。
為了處理模數在int
範圍外的情況,就是兩數相乘可能會爆long long
時,我們不能直接用整型的乘法來計算。
首先我們可以進行二進位制拆分,化乘法為加法,類似快速冪那樣,寫出乙個 \(o(\log n)\) 的快速乘
typedef long long s64;
inline void add(s64 &a, const s64 &b)
inline s64 qmul(s64 a, s64 b, const s64 &mod)
多次使用時,為了避免毒瘤出題人卡時間(或是為了優化常數),我們可以利用long double
寫出乙個優秀的 \(o(1)\) 快速乘。
簡單原理:\(a\times b\bmod p=a\times b-\lfloor \frac\rfloor\times p\)
利用long double
來處理這個 \(\lfloor \frac\rfloor\)。
然後處理一下浮點誤差就可以了。
模數較大時可能會出鍋。
不過出鍋概率很小
typedef long long s64;
typedef long double ld;
inline s64 qmul(s64 a, s64 b, s64 mod)
o 1揹包問題
給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝 入揹包中物品的總價值最大?物品個數n 5,物品重量w n 物品價值v n 包的體積是10 輸入 5 10 2 62 3 6 55 4 4 6輸出 15 include include defi...
刪除單鏈表節點O 1
一,題目 給定鍊錶的頭指標和乙個結點指標,在o 1 時間刪除該結點。鍊錶結點的定義如下 struct listnode 函式的宣告如下 void deletenode listnode plisthead,listnode ptobedeleted 二,分析 這是一道廣為流傳的google面試題,能...
矩陣轉置 O 1 空間
為了方便,使用一維陣列來分析。所謂矩陣轉置,行變列,列變行。在轉置的過程中,有的元素位置是不變的 對於變化位置的元素,要求o 1 空間完成,那麼這些位置的變化一定是有著規律的。舉例,2 5的矩陣,a 轉置後為at 探索下標變化 0 0 1 2 4 8 7 5 1 3 6 3 9 9 這些下標的變化是...