acwing演算法基礎課 演算法競賽高階指南 約數

2022-09-09 17:57:26 字數 1320 閱讀 6471

首先考慮分解質因數的演算法:

在列舉因子時,不停將x除以i直到x不是i的倍數,這樣每列舉到乙個合數i,x中所有i的因子都已經被除掉了,i不可能成為x的因子。

這樣,保證了滿足第六行x%i==0的i一定是質因數,順便統計出了每個質因數的指數。

有乙個顯然的結論:x中至多有乙個大於\(\sqrt\)的質因子,而且它的次數一定是1。(反證即可)

所以可以只迴圈到i <= x/i,如果退出迴圈後x>1,特判x是原數的一次質因子即可。

我們記每個質因子是\(p_\),次數是\(c_\)

由乘法原理易得:

由於每個質因子的次數可以選\(0\)到\(c_\),故約數的個數是

\[\prod_^ \left ( c_+1 \right )

\]考慮每個約數可以選每個質因數的\(0\)到\(c_\)次方相乘,所有約數的和為

\[\prod_^n (\sum_^}p_i^j)

\]分解質因數

#include using namespace std;

void solve(int x)

printf("%d %d\n", i, p);} }

if (x > 1) printf("%d 1\n", x);

printf("\n");

}int main()

return 0;

}

約數個數

#include #include using namespace std;

const int mod = 1e9 + 7;

int main()

}if (x > 1) hash[x]++;

}long long ans = 1;

for (auto u : hash) ans = ans * (u.second + 1) % mod;

printf("%lld", ans);

return 0;

}

約數之和

#include #include using namespace std;

const int mod = 1e9 + 7;

int main()

}if (x > 1) hash[x]++;

}long long ans = 1;

for (auto u : hash)

ans = ans * sum % mod;

}printf("%lld", ans);

return 0;

}

AcWing 演算法基礎課 動態規劃

1 揹包問題 1 01揹包 每件物品僅用一次 可以做空間優化 dp j max dp j dp j v i w i 0,1揹包狀態均是從前一迴圈的狀態轉移 2 完全揹包 每件物品可以用無限次 完全揹包的狀態可以從當前迴圈的狀態轉移,進行優化 3 多重揹包 每件物品有不同的數量限制 可以對物品的數量限...

Acwing演算法基礎課知識點

知識點 基礎演算法 模板鏈結常用 模板1 基礎演算法 排序 二分高精度 字首和與差分 雙指標演算法 位運算離散化 區間合併 資料結構 模板鏈結常用 模板2 資料結構 鍊錶與鄰接表 樹與圖的儲存 棧與佇列 單調佇列 單調棧 kmptrie 並查集堆 hash表 c stl使用技巧 搜尋與圖論 模板鏈結...

Acwing 基礎課 基礎演算法 歸併排序

參考鏈結 include const int n 100005 int a n int t n voidms int l,int r while i mid t k a i while j r t k a j for int i l i r i intmain 題目鏈結 參考鏈結 題目大意 給定乙個...