洛谷 官方题库 Python 第十一天

【数学1】基础数学问题

最大公约数gcd = math.gcd(a,b)

注意这个gcd支持传入多参数,有两种写法,建议用星号,因为reduce如果a是空数组会报错。
注意gcd(a,0)=a,即任意数和0的gcd都是自己,参照循环相减法。

gcd(*a)是Python中的一种用法,它可以计算传递给函数gcd()的可变数量的参数的最大公约数。这里*a表示将列表a解包成函数的参数,使得gcd()函数可以接受任意数量的参数。

from math import gcd
a = [12, 18, 24, 36]
result = gcd(*a)
print("列表中所有元素的最大公约数为:", result)
最小公倍数lcm = math.lcm(a,b)

写法和gcd类似。

from math import lcm
a = [12, 18, 24, 36]
result = lcm(*a)
print("列表中所有元素的最小公倍数为:", result)
质数筛法:埃氏筛O(nlgn)、线性筛O(n)(欧拉筛)
n = 10**3 # 代求的范围中的最大值
k = 0
s = [True for i in range(n)]  # 首先默认所有数都是质数
z = []
for i in range(2,n):
    if s[i]:  # 判断是否为质数,如果没有被标记过,就是质数
        k+=1
        z.append(i) #添加质数
        for j in range(i+i,n,i):   # 将是指数的倍数的数都改为False
            s[j] = False

print(k) # 个数
print(z) # 质数

杨辉三角

定义法

思路:

从第三行开始,每一行的首尾都是1,中间部分每个数字等于上一行的左右两个数字之和。先定义每一行的第一个数字,然后在利用规则对中间部分进行运算,最后再添加最后一个元素。

# 用户输入要打印的行数
n = eval(input("输入要打印的行数:"))

# 创建一个二维列表triangle,用于存储杨辉三角的每一行。前两行已经给出。
triangle = [[1], [1, 1]]

# 使用两层循环生成剩余的行数
for i in range(2, n):  # 外层循环遍历从第三行到第n行
    pre = triangle[i-1]  # 上一行
    cul = [1]  # 定义每行第一个元素
    for j in range(i-1):  # 内层循环用于计算当前行的元素
        cul.append(pre[j]+pre[j+1])  # 每个数字等于上一行的左右两个数字之和,并将结果添加到当前行中
    cul.append(1)  # 添加每行最后一个元素
    triangle.append(cul)

# 按普通输出格式打印生成的杨辉三角
print("普通输出:{}".format(triangle))

# 再次遍历生成的杨辉三角,按等边三角形格式输出
for i in range(n):
    s = " "*(n-i-1)
    for j in triangle[i]:
        s = s + str(j)+" "
    print(s)

幂运算

快速幂

def quick_count(a, b):
    sum = 1
    while b != 0:
        if b & 1:
            sum = sum * a % p
        b >>= 1
        a *= a  # 注意是x自身,容易写成x^2
    return sum

eg:

【题目描述】 给定 b p k ,求 ( b p ) mod k 。其中 2 b , p , k 10 9
【输入描述】 输入 3 个整数 b p k
【输出描述】 输出 ( b的 p次方  ) mod k 的值。
def fastPow(a, n, mod):
    ans = 1
    while n:
        if n & 1:
            ans = ans * a % mod
        a = a * a % mod
        n >>= 1
    return ans

b, p, k = map(int, input().split())
print(fastPow(b, p, k))

##int:2 10000000 1000000007
##out:255718402

矩阵乘法

1 )一个数 k 乘矩阵 A ,就是把 k 乘以矩阵的每个元素,记为 k A
2 )两个矩阵 A B 相乘,要求 A 的列数等于 B 的行数,设 A m × n 的矩阵, B n × u
的矩阵,那么乘积 C = AB m × u 的矩阵。定义矩阵乘法 C = AB 。
for(int i=1;i<=m;i++) //注:i、j、k 的先后顺序不重要,因为对于 c[][]来说都一样
 for(int j=1;j<=u;j++) 
 for(int k=1;k<=n;k++) 
 c[i][j] += a[i][k] * b[k][j]);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值