小技巧 O 1 快速乘

2022-08-05 00:03:15 字數 833 閱讀 4017

問題:求 \(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 這些下標的變化是...