数论基本模板(复习)

矩阵乘法

蓝桥1550

import os
import sys

N, M, K = map(int, input().split())
num_1 = []
num_2 = []
ans = [[0] * K for _ in range(N)]  # 结果矩阵的维度为 N 行 K 列
for _ in range(N):
    num_1.append(list(map(int, input().split())))
for _ in range(M):
    num_2.append(list(map(int, input().split())))

# 矩阵乘法计算
for i in range(N):
    for j in range(K):
        for k in range(M):
            ans[i][j] += num_1[i][k] * num_2[k][j]

# 输出结果
for i in range(N):
    for j in range(K):
        print(ans[i][j], end=' ')  # 打印每个元素,以空格隔开
    print()  # 打印换行符,进行下一行的输出
def read(A, n):
    for _ in range(n):
        A.append(list(map(int,input().split())))
def output(A):
    for x in A:
        print(' '.join(map(str, x)))
def mul(A, B):
    N, M = len(A), len(A[0])
    _M, K = len(B), len(B[0])
    if M != _M:
        return None
    C = [[0] * K for i in range(N)]
    for i in range(N):
        for j in range(K):
            for k in range(M):
                C[i][j] += A[i][k] * B[k][j]
    return C

A = []
B = []
N, M, K = map(int, input().split())
read(A, N)
read(B, M)
C = mul(A, B)
output(C)

gcd和lcm

向上取整也可以用math.ceil

 

import math

def lcm(a, b):
    return (a * b) // math.gcd(a, b)

 gcd直接调用就行

素数朴素判定

 

def is_prime(x):
  if x <= 1:
    return False
  m = int(x ** 0.5)
  for i in range(2, m + 1):
    if x % i == 0:
      return False
  return True

 

 

 蓝桥1557

import os
import sys

# 请在此输入您的代码
def get_prime(n):
  vis = [0] * (n + 1)
  prime = []
  for i in range(2, n + 1):
    if vis[i] == 0:
      prime.append(i)
      for j in range(2 * i, n + 1, i):
        vis[j] = 1
  return prime

N = int(input())
prime = get_prime(N - 1)
print(*prime)
print(len(prime))

唯一分解定理

 

 

蓝桥1559 

import os
import sys

# 请在此输入您的代码
a, b = map(int, input().split())
# 唯一分解定理
# f(n)返回n的质因子列表
def f(n):
    factor = []
    for i in range(2, n + 1):
        # 只要能够整除,我就不断地除
        while n % i == 0:
            n //= i
            factor.append(i)
        if n == 1:
            break
    return factor
for i in range(a, b + 1):
  factor = f(i)
  print("{}=".format(i), end='')
  print(*factor, sep='*')

 

蓝桥1020

 

 

import os
import sys

# 请在此输入您的代码
# 每个数进行质因子分解
# 然后累计求出阶乘地质因子分解
from collections import Counter # 计数器,统计一个列表出现的次数
def f(n):
    factor = []
    for i in range(2, n + 1):
        # 只要能够整除,我就不断地除
        while n % i == 0:
            n //= i
            factor.append(i)
        if n == 1:
            break
    return factor
all_factor = []
for i in range(2, 101):
  all_factor += f(i)
all_factor = Counter(all_factor)
ans = 1
for k, v in all_factor.items():
  ans *= v + 1
print(ans)

快速幂

模板1:

def ksm(a, b, c):
    if b == 0:
        return 1
    if b == 1:
        return a % c
    ans = ksm(a, b // 2, c)
    ans = ans * a % c
    if b % 2 == 1:
        ans = ans * a % c
    return ans
b, p, k = map(int, input().split())
print(ksm(b,p,k))

模板2:

def ksm(a, b, c):
    ans = 1 % c
    while b:
        if b % 2 == 1:
            ans = ans * a % c
        b //= 2
        a = a * a % c
    return ans
b, p, k = map(int, input().split())
print(ksm(b,p,k))

矩阵快速幂

def ksm(A, b):
    N = len(A)
    ans = [[1 if i == j else 0 for j in range(N)] for i in range(N)]
    while b:
        if b % 2 == 1:
            ans = mul(ans, A)
        b //= 2
        A = mul(A, A)
    return ans

蓝桥1511

import os
import sys

def read(A, n):
    for _ in range(n):
        A.append(list(map(int,input().split())))
def output(A):
    for x in A:
        print(' '.join(map(str, x)))
def mul(A, B):
    N, M = len(A), len(A[0])
    _M, K = len(B), len(B[0])
    if M != _M:
        return None
    C = [[0] * K for i in range(N)]
    for i in range(N):
        for j in range(K):
            for k in range(M):
                C[i][j] += A[i][k] * B[k][j]
    return C
def ksm(A, b):
    N = len(A)
    ans = [[1 if i == j else 0 for j in range(N)] for i in range(N)]
    while b:
        if b % 2 == 1:
            ans = mul(ans, A)
        b //= 2
        A = mul(A, A)
    return ans

N, M = map(int, input().split())
A = []
read(A, N)
output(ksm(A,M))

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值