首先考慮分解質因數的演算法:
在列舉因子時,不停將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 題目鏈結 參考鏈結 題目大意 給定乙個...