首页 > 其他分享 >【数论】最大公因数和最小公倍数(GCD和LCM)

【数论】最大公因数和最小公倍数(GCD和LCM)

时间:2024-04-14 13:11:42浏览次数:28  
标签:LCM gcd 公倍数 144403552893600 prod lcm 公因数

最大公因数(GCD)

两个数的最大公因数很好做,使用内置的库函数即可,注意x和y的类型要相同。

ll gcd = __gcd (x, y);

如果要求多个数的最大公因数,那么初始化为0(因为根据定义,0和任何数x的gcd都是x,所以0是gcd操作的幺元),然后分别进行gcd即可。

ll gcd = 0;
for (int i = 1; i <= n; ++i) {
    gcd = __gcd (gcd, a[i]);
}

负数也可以用gcd,不过不推荐这样操作,让自己变得混淆。尽量对操作数都进行一次abs操作就好了。

每个数都有固定的质因数分解形式,也就是算术基本定理

GCD的过程就是对每个数的对应质数的幂取最小值。

最小公倍数(LCM)

两个数的LCM可以用下列的方法直接算出来:

ll lcm = x / __gcd (x, y) * y;

其中先除后乘是尽可能避免溢出,尽量保持这个习惯。

多个数的lcm就稍微少见一些。

ll lcm = 1;
for (int i = 1; i <= n; ++i) {
    ll gcd = __gcd (lcm, a[i]);
    lcm = lcm / gcd * a[i];
}

每个数都有固定的质因数分解形式,也就是算术基本定理

LCM的过程就是对每个数的对应质数的幂取最大值。

由算术基本定理,可以这样证明:
假设目前求出了所有元素的各个幂次的最大值,初始化自然为0,所以他们的乘积为1。1是lcm操作的幺元。

根据上面的算法,求出当前lcm和a[i]的gcd。在算术基本定理下,对于每个幂次都是保留了其中的最小值。

然后lcm和a[i]做乘法,再除以gcd,在算术基本定理下,相当于:

每种质数的幂先做加法,然后减去他们之间的最小值,所以相当于保留最大值。

于是得证。

几个可能有用的上界:

前i个数的gcd。

i = 1, lcm = 1
i = 2, lcm = 2
i = 3, lcm = 6
i = 4, lcm = 12
i = 5, lcm = 60
i = 6, lcm = 60
i = 7, lcm = 420
i = 8, lcm = 840
i = 9, lcm = 2520
i = 10, lcm = 2520
i = 11, lcm = 27720
i = 12, lcm = 27720
i = 13, lcm = 360360 (4e5)
i = 14, lcm = 360360
i = 15, lcm = 360360
i = 16, lcm = 720720 (7e5)
i = 17, lcm = 12252240 (1e7)
i = 18, lcm = 12252240
i = 19, lcm = 232792560 (2e8)
i = 20, lcm = 232792560
i = 21, lcm = 232792560
i = 22, lcm = 232792560
i = 23, lcm = 5354228880 (5e9 > 2e9 = INT_MAX)
i = 24, lcm = 5354228880
i = 25, lcm = 26771144400
i = 26, lcm = 26771144400
i = 27, lcm = 80313433200
i = 28, lcm = 80313433200
i = 29, lcm = 2329089562800
i = 30, lcm = 2329089562800
i = 31, lcm = 72201776446800
i = 32, lcm = 144403552893600
i = 33, lcm = 144403552893600
i = 34, lcm = 144403552893600
i = 35, lcm = 144403552893600
i = 36, lcm = 144403552893600
i = 37, lcm = 5342931457063200
i = 38, lcm = 5342931457063200
i = 39, lcm = 5342931457063200
i = 40, lcm = 5342931457063200
i = 41, lcm = 219060189739591200
i = 42, lcm = 219060189739591200 (2e18)
i = 43, lcm = -9027155914907130016 (? > 9e18 = LONG_LONG_MAX)
i = 1, p = 2, prod = 2
i = 2, p = 3, prod = 6
i = 3, p = 5, prod = 30
i = 4, p = 7, prod = 210
i = 5, p = 11, prod = 2310
i = 6, p = 13, prod = 30030
i = 7, p = 17, prod = 510510 (5e5)
i = 8, p = 19, prod = 9699690 (1e7)
i = 9, p = 23, prod = 223092870 (2e8)
i = 10, p = 29, prod = 6469693230 (6e9 > 2e9 = INT_MAX)
i = 11, p = 31, prod = 200560490130
i = 12, p = 37, prod = 7420738134810
i = 13, p = 41, prod = 304250263527210
i = 14, p = 43, prod = 13082761331670030
i = 15, p = 47, prod = 614889782588491410 (6e17)
i = 16, p = 53, prod = -4304329670229058502 (? > 9e18 = LONG_LONG_MAX)

标签:LCM,gcd,公倍数,144403552893600,prod,lcm,公因数
From: https://www.cnblogs.com/purinliang/p/18134031

相关文章

  • 洛谷题单指南-数学基础问题-P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
    原题链接:https://www.luogu.com.cn/problem/P1029题意解读:已知x,y,求有多少对p、q,使得p、q的最大公约数为x,最小公倍数为y。解题思路:枚举法即可。枚举的对象:枚举p,且p必须是x的倍数,还有p<=yq的计算:q=x*y/p,q要存在,必须x*y%p==0,且gcd(p,q)==x100分代码:#include......
  • AI绘画:使用ComfyUI结合LCM进行实时绘图:开启AI艺术创作新篇章
    在数字艺术的世界里,ComfyUI和LCM(LatentContextualModulation)的结合为艺术家和设计师们提供了一个强大的实时绘图工具。LCM是一种先进的技术,它能够实时地将用户的输入和反馈融入到图像生成过程中,从而创造出动态变化的艺术作品。本文将作为一篇教程,引导你如何使用ComfyUI结合LC......
  • C语言经典例题(17) --- 最小公倍数、单词倒置、你是天才吗?、完美成绩、判断整数的奇偶
    1.最小公倍数正整数A和正整数B的最小公倍数是指能被A和B整除的最小的正整数,设计一个算法,求输入A和B的最小公倍数。输入描述:输入两个正整数A和B。输出描述:输出A和B的最小公倍数。输入:57输出:35#include<stdio.h>intmain(){inta=0;intb=0;int......
  • C语⾔编程题 计算最⼤公约数 和 打印最⼩公倍数
    1.计算最⼤公约数1.1 题⽬描述:      输⼊2个整数m和n,计算m和n的最⼤公约数,并打印出结果2.2解法思路:       最⼤公约数是指两个或多个整数共有约数中最⼤的⼀个。为了求出两个数的最⼤公约数,可以采⽤: •枚举试除法: 1.具体来说,公约数⼀定⼩于两个......
  • 求两个数的最大公约数 和 求两个数的最小公倍数
    求两个数的最大公约数题目内容:输入两个正整数num1和num2(不超过1000),求它们的最大公约数并输出。我们定义求最大公约数的函数为hcf,给出程序主体如下:num1=int(input(""))num2=int(input(""))print(hcf(num1,num2))请补充完成hcf函数的定义。 输入格式:共两行,每一行输入一......
  • C语言经典例题 --- 公因数、素数、闰年
    文章目录如何用代码实现求两个值之间的最大公因数呢?如何计算闰年?如何用代码实现判断一个数是否为素数如何用代码实现求两个值之间的最大公因数呢?代码如下:#include<stdio.h>intmain(){intm=0;intn=0;intmin=0;scanf("%d%d",&......
  • NOJ南邮上机 最大公约数和最小公倍数 PROB1006 Python
    PROB1006  最大公约数和最小公倍数描述:求两个正整数的最大公约数和最小公倍数输入:两个正整数A,B输出:两个正整数的最大公约数、最小公倍数样例输入:43样例输出:112defmax_gcd(a,b):whileb!=0:temp=a%ba=bb=temp......
  • 杭电OJ 2028求n个数的最小公倍数
    LowestCommonMultiplePlus首先,求a、b两个数的最小公倍数很简单,只要先求出其最大公约数,再\(a*b/GCD(a,b)\)。那么求n个数的最小公倍数,思路也是一样的。但是OJ判题一直WA,查了一下别的博客,发现错误的原因是在求公倍数的过程中要先除再乘,防止溢出,即\(a/GCD(a,b)*b\)以及要......
  • lcm(a,b)=a*b/gcd(a,b)
    求俩组爆int的数据的最小公倍数lcm等价于求这俩个数的最大公因数gcd即lcm(a,b)=a*b/gcd(a,b)求俩组爆int数据的最大公因数可以使用辗转相除法`include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;llgcd(llda,llxiao){inttemp;while(xiao!=0){temp......
  • [ARC122E] Increasing LCMs 题解
    Description给定长度为\(N\)的正整数序列\(\{A_i\}\),满足\(A_i\)单调升。问是否能将\(\{A_i\}\)重排为序列\(\{x_i\}\),满足:令\(y_i=\operatorname{LCM}(x_1,\dots,x_i)\),\(\forall1\lei<N,y_i<y_{i+1}\)(即\(y_i\)单调升)。$1\\leq\N\\leq\......