演算法模板:大數乘法,並查集
阿新 • • 發佈:2020-09-21
-
大數乘法:
-
模擬乘法手算累加:
-
和小學生一樣豎式計算,逐位相乘,結果相加(很麻煩)
-
改進:先不算任何進位,只儲存每一位結果,最後從右到左相加
int result[num1.length+num2.length]; //結果不會比倆數長度加起來還長 for(int i=0; i<num1.size(); i++) { for(int j=0; j<num2.size(); j++) { //不考慮進位,先乘了再說 result[i+j+1] += num1[i] * num2[j]; //+1位給最後最高位進位留空間 } } //單獨處理進位 for(int k = result.size()-1; k>0 ; k--) { if(result[k] > 10) { result[k-1] += result[k] / 10; result[k] %= 10; } }
-
-
分治乘法:
-
快速數論變換(FNTT):
-
中國剩餘定理:
-
-
並查集
-
原理:連線成一個通路的擁有一個共同的父節點
-
應用:連通路問題,並聯計算
-
模板:
find尋找父節點
- 非遞迴版
int find(int x) { while(x != pre[x]) { x = pre[x] = pre[pre[x]]; //路徑壓縮 } return x; }
- 遞迴版
int find(int x) { return x == pre[x] ? x : pre[x] = find(pre[x]); }
union聯合兩個分支
void Union(int x,int y) { int fx = find(x); int fy = find(y); if(fx != fy) { pre[fx] = fy; } }
-