简单约数

当然是重要的图片:

max d&w

关于约数

若整数 n 除以整数 d 的余数为 0,即 d 能整除 n,则称 dn 的约数,记作 d|n

算数基本定理推论

在算数基本定理中:若正整数 N 被唯一分解为 N=p1c1p2c2pmcm,其中 ciZ,piP,p1<p2<<pm,则 N 的正约数集合可写作:

N 的正约数个数为(可用乘法原理证明):

i=1m(ci+1)

N 的所有正约数之和为:

i=1m(j=0ci(pi)j)

求正约数集合

N 的正约数集合

类似试除法:

void DivideNum(const int n) {
    if (n % i == 0) {
        fac[++m] = i;
        if (i != n / i)
            fac[++m] = n / i;
    }
}

由此我们得到一个推论:

一个整数 N 的约数个数上限为 2N

[1,N] 每个数的正约数集合

如果枚举 1N 试除法变成 O(NN) 显然太慢了,换个思路:1N 中以 d 为约数的数就是 d 的倍数 1d,2d,3d,

std::vector<int> fac[N];
void DivideNum(const int n) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n / i; j++)
            fac[i * j].push_back(i);
    }
}

复杂度是调和级数 O(NlogN) 的。

由此我们可以得到一个新的推论:

1N 每个数的约数个数的总和大约为 NlogN

最大公约数、最小公倍数

不加证明地给出一些定理,证明并不困难,大多可以通过定义和同余的推论来验证:

  • a,bN,gcd(a,b)×lcm(a,b)=a×b

  • 更损相减术
    • a,bN,ab,gcd(a,b)=gcd(b,ab)=gcd(a,ab)

    • a,bN,gcd(2a,2b)=2gcd(a,b)

  • 欧几里得算法
    • a,bN,b0,gcd(a,b)=gcd(b,amodb)

    • 复杂度是 O(log(a+b)) 的,是最常用的求解 gcd 的方法。在高精度除法中可以考虑使用更损相减术来代替欧几里得算法
posted @   起汐  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示