python - 查找给定范围内的数字,使给定列表中任何元素的数字的 gcd 始终为 1

给定一个数字 M 和一个包含 N 个元素的列表 A (A1, A2, ...) 找到所有数字 k 以便: 1=

这是我的代码,唯一的问题是它在彼此之间使用循环,如果我的输入很大,这会减慢过程,我该如何修复它以便它需要更少的时间?

N, M = [int(v) for v in input().split()]
A = [int(v) for v in input().split()]
from math import gcd
cnt = 0
print(N)
for k in range(1, M+1):
    for i in range(N):
        if gcd(k, A[i]) == 1:
            cnt += 1
            if cnt == N:
                print(k)
    cnt = 0

输入示例:(第一行包含 N 和 M,第二行包含列表 A1、A2、...)

3 12
6 1 5

最佳答案

这是一个消除嵌套循环的快速版本:

N, M = [int(v) for v in input().split()]
A = [int(v) for v in input().split()]
from math import gcd
print(N)

l = 1
for v in A:
    l = l*v//gcd(l, v)

for k in range(1, M+1):
    if gcd(l, k) == 1:
        print(k)

它的工作原理是首先采用 A 中的值的 LCM,l。然后检查 kl 的 GCD 是否为 1 就足够了,这意味着 A 中的任何值都没有公因数.

注意:如果你使用的 Python 版本比我新(3.9 或更高版本),你可以从 math 导入 lcm 并替换 l = l*v//gcd(l, v)l = lcm(l, v)

或者,正如 Kelly Bundy 指出的那样,lcm 接受任意数量的参数,因此第一个循环可以替换为 l = lcm(*A) 如果您'正在使用 3.9 或更高版本。

https://stackoverflow.com/questions/75352040/

相关文章:

pdf - PDF 的 BitsPerComponent 如何转换为图像的每像素位数?

python - sys.getrefcount 继续

vbscript - 当我的 InstallShield 安装程序尝试运行我的 VBS 自定义操作时

vb.net - 将参数用于 Oracle ODBC 连接

.net - .NET : System. InvalidOperationException :

installation - 如何通过 .msi 包修改 machine.config

c++-cli - 如何将 System::IntPtr 转换为 char*

wpf - ListBox 中的 TextBox、Button 和 ListBox

sql-server-2005 - 强制 SQL Server 列为特定值

sql-server - 从现有数据库生成 SQL DDL 和内容的工具