算数基本定理

1|0算数基本定理

1|1定理

对于整数 a>1,必有 a=p1a1p2a2psas,其中 pj(1js) 是两两不相等的质数,aj(1js) 表示对应质数的幂次。在不计次序的意义下,该分解式是唯一的。

运用于质因数分解:

int Decomposition(int x, int a[]) { int cnt = 0; for (int i = 2; i <= x / i; i++) { for (; x % i ==0; x /= i) { a[++cnt] = i; } } if (x > 1) a[++cnt] = x; return cnt; }

1|2推论

  1. da 的约数的充要条件d=p1e1p2e2pses,0ejaj,1js,即 d 中每个质数的幂次都不超过 a 中每个质数的幂次。

    1. 每个质因子上的幂次直接决定了两数之间的整除性。
    2. 12=22×3,72=23×32,看到 12 的质因子上的每个幂次都对应地比 72 小,便可以在进行取模运算的情况下给出 12|72 的结论。
  2. b=p1e1p2e2pses,(这里允许某些 ajej 为零),那么 (a,b)=p1d1p2d2psds,dj=min(aj,ej),1js,以及[a,b]=p1y1p2y2psys,yj=min(aj,ej),1js

    1. 10=2×5,16=24

      1. (10,16)=2min(1,4)×5min(1,0)=21×50=2

      2. [10,16]=2max(1,4)×5max(1,0)=24×51=80

      3. (10,16)[10,16]=2min(1,4)×5min(1,0)×2max(1,4)×5max(1,0)=2min(1,4)+max(1,4)×5min(1,0)+max(1,0)=21+451+010×16=2×5×20=21+4×51+0

      4. 这刚好证明了 [a1,a2](a1,a2)=a1a2,本质上是 min(a,b)+max(a,b)=a+b

  3. 除数函数 r(a) 表示 a 的所有正约数的个数,则 r(a)=(a1+1)(a2+1)(as+1)=r(p1a1)r(p1as)

    1. 即推论1.的推论,对于每个质因子上的幂次,可以取 0ai 中的任意整数,共有 ai+1 个。由乘法原理可以直接得出。
    2. a=27×38×59,可以直接写出 a 的因子个数 (7+1)(8+1)(9+1)=720
    3. 第二个等号展现了质因子的“独立性”。
  4. 除数和函数 o(a) 表示 a 的所有正约数的和,则 o(a)=p1a1+11p11p1as+11p11=o(p1a1)o(p1as)

    1. 亦为推论1.的推论,对于 a=120=23×3×5 的因子分别是 1,2,3,4,5,6,8,10,12,15,20,24,30,40,60,120

    2. 然后用等比数列求和公式(p1a1+11p11=1+p1++p1a1)展开那个算式。

      o(120)=241213213152151=(23+22+21+1)(31+1)(51+1)

      最后再展开括号,即为所有因数。

1|3例题

P1069 [NOIP2009 普及组] 细胞分裂

即对推论一的应用。

由推论一可得,当 m1m2 中每个质因子的幂次都比 Sixi 小时,m1m2|Sixi 成立。 Sixi 中的质因子是否出现由 Si 决定,而质因子出现了几次主要由 xi 决定。若 Si=p1e1p2e2psesps+1es+1ps+res+rps+1ps+r 表示与 m1 无关的质因子),那么 xi 应该使得对于所有的 ijsj,满足 ajm2ejxi

所以从 m1 中的质因子 pj 出发:

  • 如果这个 si 不能整除 pj,则说明 si 不包含这个质因子,进而说明不符合题目要求
  • 如果这个 si 能整除 pj,那么只要求出对应的 ej,就能算出第 j 个质因子,要求 xi 不小于 ajm2ej,再对所有这样的要求取最大值,就得到了 xi,最后对所有合法的 xi 取最小值就是答案。
#include <bits/stdc++.h> #define maxn 10010 int m1, m2, n, pri[maxn], tot[maxn], a[maxn]; int Decomposition(int x) { int cnt = 0, Cnt = 0; for (int i = 2; i * i <= x; i++) { for (; x % i == 0; x /= i) { a[++cnt] = i; } } if (x > 1) a[++cnt] = x; for (int i = 1; i <= cnt; i++, tot[Cnt]++)//tot记录对应质数的次数 { if (a[i] != a[i - 1]) pri[++Cnt] = a[i];//pri记录m1中出现的质数 } return Cnt; } int main() { std::cin >> n >> m1 >> m2; int cnt = Decomposition(m1), ans = 2e9, s; while (n--) { std::cin >> s; int x = 0; for (int i = 1; i <= cnt; i++) { int p = pri[i]; if (s % p != 0) { x = -1; break; } else { int e = 0; for (; s % p == 0; s /= p) e++; x = std::max(x, 1 + (m2 * tot[i] - 1) / e); } } if (x >= 0) ans = std::min(ans, x); } if (ans >= 2e9) { puts("-1"); } else { printf("%d", ans); } }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17874403.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示