【数论】约数
创始人
2024-02-16 14:14:13

文章目录

    • 一、试除法求n的所有约数
    • 二、约数个数
    • 三、约数之和
    • 四、最大公约数(欧几里得算法/辗转相除法)

一、试除法求n的所有约数

vector getDivisors(int n) {vector ans;for (int i = 2; i <= n / i; i++) {if (n % i == 0) {ans.push_back(i);if (i != n / i) {ans.push_back(n / i); // n == n/i,只需要存一个}}}return ans;
}

时间复杂度:O(n)O(\sqrt n)O(n​)

二、约数个数

约数和质因子并不是一个意思,但每个约数可以表示成质因子的乘积

算数基本定理:n=p1c1∗p2c2∗...∗pkckn=p_1^{c_1}*p_2^{c_2}*...*p_k^{c_k}n=p1c1​​∗p2c2​​∗...∗pkck​​的约数个数为:(c1+1)(c2+1)…(ck+1)(c_1+1)(c_2+1)…(c_k+1)(c1​+1)(c2​+1)…(ck​+1),pkp_kpk​为质因子

例子:12=22×3112=2^2×3^112=22×31,12的约数有1,2,3,4,6,12共6个,根据公式计算同样是(2+1)×(1+1)=6(2+1)×(1+1)=6(2+1)×(1+1)=6个

n的每个约数m都可以表示成m=p1b1∗p2b2∗...∗pkbkm=p_1^{b_1}*p_2^{b_2}*...*p_k^{b_k}m=p1b1​​∗p2b2​​∗...∗pkbk​​的形式,0<=bk<=ck0<=b_k<=c_k0<=bk​<=ck​,每个bkb_kbk​有(ck+1)(c_k+1)(ck​+1)种选法,于是就有(c1+1)(c2+1)…(ck+1)(c_1+1)(c_2+1)…(c_k+1)(c1​+1)(c2​+1)…(ck​+1)个因数

我们分解质因子后,获取质因子的指数,最后套用(c1+1)(c2+1)…(ck+1)(c_1+1)(c_2+1)…(c_k+1)(c1​+1)(c2​+1)…(ck​+1)即可

int getDivisorsNum(int n) {vector nums;for (int i = 2; i <= n / i; i++) {if (n % i == 0) {int num = 0;while (n % i == 0) {n /= i;num++;}// 获取质因子的指数nums.push_back(num);}}if(n > 1) nums.push_back(1);int ans = 1;for (int num : nums) {ans *= (num + 1);}return ans;
}

三、约数之和

在这里插入图片描述

例子:12=22×3112=2^2×3^112=22×31,12的约数有1,2,3,4,6,12,约数之和为28,根据公式计算同样是(20+21+22)×(30+31)=28(2^0+2^1+2^2)×(3^0+3^1)=28(20+21+22)×(30+31)=28个

其中,p0+p1+p2+...+pn=(((p+1)×p+1)×p+1...)+1p^0+p^1+p^2+...+p^n=(((p+1)×p+1)×p+1...)+1p0+p1+p2+...+pn=(((p+1)×p+1)×p+1...)+1,一直循环n次

int getDivisorsSum(int n) {const int mod = 1e9 + 7;unordered_map primes;for (int i = 2; i <= n / i; i++) {if (n % i == 0) {while (n % i == 0) {n /= i;primes[i]++;}}}if (n > 1) primes[n] = 1;long long ans = 1;for (auto prime : primes) {int p = prime.first;int n = prime.second;// 计算sum = p^0 + p^1 + p^2 + ... + p^nlong long sum = 1;while (n >= 1) {sum = (sum * p + 1) % mod;n--;}ans = ans * sum % mod;}return ans;
}

四、最大公约数(欧几里得算法/辗转相除法)

如果d是a的约数,也是b的约数,则d是ax+by的约数,则有:gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a\%b)gcd(a,b)=gcd(b,a%b),gcd(a,0)=agcd(a,0)=agcd(a,0)=a

比如a=24,b=18,那么gcd(24,18)=6,gcd(18,24%18)=6

int gcd(int a, int b) {return b ? gcd(b, a % b) : a;
}

时间复杂度为O(logn)O(logn)O(logn)

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...