打开/关闭搜索
搜索
打开/关闭菜单
通知
打开/关闭个人菜单
查看“算数基本定理”的源代码
来自吾萌百科
查看
阅读
查看源代码
查看历史
associated-pages
页面
讨论
更多操作
←
算数基本定理
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您必须确认您的电子邮件地址才能编辑页面。请通过
参数设置
设置并确认您的电子邮件地址。
您可以查看和复制此页面的源代码。
'''算数基本定理(Fundamental Theorem of Arithmetic)'''即:任何一个大于1的正整数都能被唯一分解为有限个素数的乘积,可写作: <math>N = \prod_{i=1}^n p_i^{c_i} = {p_1}^{c_1}{p_2}^{c_2}\cdots{p_n}^{c_n}</math> 其中 <math>c_i</math> 都是正整数,<math>p_i</math> 都是素数,且满足 <math>p_1<p_2<\cdots <p_n</math> == 实现 == 结合素数判定的“试除法”和素数筛选的“Eratosthenes筛法”,我们可以扫描 <math>2 \backsim \lfloor \sqrt N \rfloor</math> 的每个数d,若d能整除N,则从N中除掉所有的因子d,同时累计除去的d的个数。 因为一个合数的因子一定在扫描到这个合数之前就从N中被除掉了,所以在上市u过程中能整除N的一定是素数。最终就得到了分解素因数的结果,易知时间复杂度为 <math>O(\sqrt N)</math>。 特别的,若N没有被任何 <math>2 \backsim \lfloor \sqrt N \rfloor</math> 的数整除,则N是素数,无需分解。 <syntaxhighlight lang="c" line> int c[MAX_N], p[MAX_N]; int m; void divide(int n) { m = 0; for (int i = 2; i < sqrt(n); ++i) { if (n % i == 0) { p[++m] = i; c[m] = 0; } while (n % i == 0) { n /= i; c[m]++; } } if (n > 1) { p[++m] = n; c[m] = 1; } } </syntaxhighlight> == 参考资料 == # 算法竞赛进阶指南,李煜东,137页 [[Category:数学]]
返回
算数基本定理
。