[数论]约数篇(正约数合集、正约数个数和正约数之和、最大公约数)

约数

若整数除以整数的余数为0,即能整除,则称的约数,的倍数,记为,言而总之:一个数如果能够被另一个数整除,那么这个数就是另一个数的约数。例如,6是12的约数,因为12可以被6整除。

算术基本定理推论:

若正整数被唯一分解为:

其中都是正整数,都是质数,且满足;即分解质因数操作。

正约数合集

的正约数合集可以写作:

,其中

代码

题目:给定n个正整数,对于每一个整数,请你按照从小到大的顺序输出它的所有约数

#### 无需分解质因数 #### 
# 导入包用于求平方根math.sqrt
import math
# 分解质因数将N分解为p1^c1*p2^c2...*pm^cm的形式(核心)                         
def solve(n):
    #用于存放正约数合集
    res = [] 
    # 遍历[1,sqrt(n)],时间减少sqrt(n)
    for base in range(1, int(math.sqrt(n) + 1)):
        # 如果base可以被n整除
        if n % base == 0 :
           # 把base是n的正约数,放入正约数合集
           res.append(base)
           # 时间减少到sqrt(n),如果n除以base不等于base,即16//2=8,那么8也是16的正约数;
           # 防止重复放,如:4*4=16, 有两个4;(完全平方数情况不再次放)
           if n // base != base:
               res.append(n//base)
    # 从小到大
    for v in sorted(res):
        # 打印结果
        print(v,end=' ')
    print()
# 主函数
if __name__ == '__main__':
    for _ in range(int(input())):
        solve(int(input()))

正约数个数(多个数乘积的约数个数)

的正约数个数为:

[数论]约数篇(正约数合集、正约数个数和正约数之和、最大公约数)_第1张图片

代码

题目:给定n个正整数,请你输出这些数的乘积的约数个数,答案对取模。

#### 分解质因数 #### 
primes = {}
t = int(input())
for _ in range(t):
    n = int(input())
    base = 2
    while base*base <= n:
        while n%base == 0:
            if base not in primes:
                primes[base] = 1
            else:
                primes[base] += 1
            n //= base
        base += 1
    if n > 1:
        if n not in primes:
            primes[n] = 1
        else:
            primes[n] += 1
    
res = 1
mod = 1e9+7
for each in primes:
    res *= primes[each] + 1 % mod
print(int(res% mod))

正约数之和(多个数乘积的约数之和)

的正约数之和为:

代码

题目:给定n个正整数,请你输出这些数的乘积的约数之和,答案对取模。

primes = {}
t = int(input())
for _ in range(t):
    n = int(input())
    base = 2
    while base * base <= n:
        while n % base == 0:
            if base not in primes:
                primes[base] = 1
            else:
                primes[base] += 1
            n //= base
        base += 1
    
    if n > 1:
        if n not in primes:
            primes[n] = 1
        else:
            primes[n] += 1
    
def quick_pow(a, n):
    res = 1
    while n:
        if n&1:
            res *= a % mod
        n >>= 1
        a *= a % mod
    return int(res%mod)

res = 1
mod = int(1e9 + 7)
for each in primes:
    cnt = 0
    for pow in range(primes[each]+1):
        cnt += quick_pow(each, pow)
    res *= cnt
print(int(res%mod))

求最大公约数

题目:给定n对正整数,请你求出每对数的最大公约数

# 加载输入“n对正整数”
def load_dataest():
    n = int(input())
    dataset = []
    for _ in range(n):
        dataset.append(list(map(int, input().split())))
    return n, dataset
'''
求两个正整数 a 和 b 的 最大公约数 d
则有 gcd(a,b) = gcd(b,a%b)
证明:
    设a%b = a - k*b 其中k = a/b(向下取整)
    若d是(a,b)的公约数 则知 d|a 且 d|b 则易知 d|a-k*b 故d也是(b,a%b) 的公约数
    若d是(b,a%b)的公约数 则知 d|b 且 d|a-k*b 则 d|a-k*b+k*b = d|a 故而d同时整除a和b 所以d也是(a,b)的公约数
    因此(a,b)的公约数集合和(b,a%b)的公约数集合相同 所以他们的最大公约数也相同 证毕#
'''
def gcd(a, b):
    return a if b==0 else gcd(b,a%b)

if __name__ == "__main__":
    n, dataset = load_dataest()
    for i in range(n):
        a, b = dataset[i]
        print(gcd(a, b))

你可能感兴趣的:(#,阿良的Python算法,python,开发语言)