首页 > 其他分享 >【数论】约数

【数论】约数

时间:2022-11-26 12:09:04浏览次数:39  
标签:约数 数论 sum int 因子 num ans


文章目录

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

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

vector<int> getDivisors(int n) {
vector<int> 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;
}

时间复杂度:【数论】约数_数据结构

二、约数个数

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

算数基本定理:【数论】约数_约数个数_02的约数个数为:【数论】约数_约数个数_03【数论】约数_约数个数_04为质因子

例子:【数论】约数_算法_05,12的约数有1,2,3,4,6,12共6个,根据公式计算同样是【数论】约数_算法_06

n的每个约数m都可以表示成【数论】约数_算法_07的形式,【数论】约数_质因子_08,每个【数论】约数_约数个数_09【数论】约数_质因子_10种选法,于是就有【数论】约数_约数个数_03个因数

我们分解质因子后,获取质因子的指数,最后套用【数论】约数_约数个数_03即可

int getDivisorsNum(int n) {
vector<int> 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;
}

三、约数之和

【数论】约数_质因子_13

例子:【数论】约数_算法_05,12的约数有1,2,3,4,6,12,约数之和为28,根据公式计算同样是【数论】约数_约数个数_15

其中,【数论】约数_算法_16,一直循环n次

int getDivisorsSum(int n) {
const int mod = 1e9 + 7;
unordered_map<int, int> 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^n
long long sum = 1;
while (n >= 1) {
sum = (sum * p + 1) % mod;
n--;
}
ans = ans * sum % mod;
}
return ans;
}

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

如果d是a的约数,也是b的约数,则d是ax+by的约数,则有:【数论】约数_约数个数_17【数论】约数_约数个数_18

比如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;
}

时间复杂度为【数论】约数_数据结构_19


标签:约数,数论,sum,int,因子,num,ans
From: https://blog.51cto.com/BugMaker/5888779

相关文章

  • 关于基础数论之同余定理
    数论中的重要概念。给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(modm)。对模m同余是整数的一个等价关......
  • 【Python】第4章-10 最大公约数和最小公倍数
    本题要求两个给定正整数的最大公约数和最小公倍数。输入格式:输入在一行中给出两个正整数M和N(≤1000)。输出格式:在一行中顺序输出M和N的最大公约数和最小公倍数,两数字......
  • Luogu P1306 斐波那契数列公约数
    斐波那契公约数题目描述对于Fibonacci数列:\[f_i=\begin{cases}[i=1]&i\leq1\\f_{i-1}+f_{i-2}&i\gt1\end{cases}\]请求出......
  • 51nod 1165 整边直角三角形的数量 【数学:公式--求约数】
    1165 整边直角三角形的数量基准时间限制:2 秒空间限制:131072 KB分值: 160 难度:6级算法题 收藏 关注直角三角形,三条边的长度都......
  • 求最大公约数
    #pragmawarning(disable:4996)#include<stdio.h>intmain(){intn=0;intm=0;intq=0;printf("请输入需要求最大公约数的两组数字:");scanf("%d%d",&n,&m......
  • 洛谷 P1403 约数研究
    洛谷P1403约数研究P1403约数研究-洛谷前置知识\(a\)能整除\(b\)用符号表示为\(b\mida\)\(1\simn\)中约数(即因子)含\(x\)的个数为\(\left\lfloor\df......
  • 【UOJ771】【UER11】科考工作(数论,构造)
    题意:给定质数\(p\)和\(2p-1\)个数\(a_1,\cdots,a_{2p-1}\),从中选出\(p\)个数使得它们模\(p\)意义下的和为\(0\),要求给出构造。\(p\leq3\times10^5\)。题解:......
  • 利用递归求两个数的最大公约数
    #include<stdio.h>inthcf(intn1,intn2);intmain(){intn1,n2;printf("输入两个正整数:");scanf("%d%d",&n1,&n2);printf("%d和%d的最大公约数......
  • 数论分块
    数论分块对于含有除法向下取整的式子,可以使用数论分块,将\(\left\lfloor\frac{n}{i}\right\rfloor\)相同的数统一计算。使式子\(\left\lfloor\frac{n}{i}\right......
  • 最大公约数
    最大公约数欧几里得算法对于两个数\(a,b\),设\(a>b\),当\(a\%b==0\)时,答案为\(b\)。否则,设\(a=b*q+r,r<b\),则\(gcd(a,b)=gcd(b,a\%b)\),时间复杂度\(O(\logN)\)......