首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用Scipy.Sparse实现GF(256)中稀疏矩阵的快速点乘

基础概念

GF(256) 是一个有限域,包含 256 个元素。在 GF(256) 中,矩阵的元素是 8 位无符号整数,通常用于密码学和编码理论中的多项式运算。稀疏矩阵是指大部分元素为零的矩阵,存储和计算时可以大大减少资源消耗。

Scipy.Sparse 是 Scipy 库中的一个模块,提供了多种稀疏矩阵的存储格式和操作方法。

相关优势

  1. 节省存储空间:稀疏矩阵只存储非零元素及其位置,大大减少了内存占用。
  2. 提高计算效率:在矩阵运算中,只对非零元素进行操作,避免了大量零元素的无效计算。

类型

Scipy.Sparse 提供了多种稀疏矩阵格式,如 CSR (Compressed Sparse Row)、CSC (Compressed Sparse Column)、COO (Coordinate) 等。每种格式适用于不同的操作场景。

应用场景

稀疏矩阵广泛应用于科学计算、图像处理、自然语言处理等领域,特别是在需要处理大规模数据且大部分数据为零的情况下。

实现 GF(256) 中稀疏矩阵的快速点乘

在 GF(256) 中进行稀疏矩阵点乘时,需要注意以下几点:

  1. 模运算:GF(256) 中的元素需要进行模 256 运算。
  2. 稀疏矩阵格式选择:选择合适的稀疏矩阵格式可以提高计算效率。

以下是一个使用 Scipy.Sparse 实现 GF(256) 中稀疏矩阵点乘的示例代码:

代码语言:txt
复制
import numpy as np
from scipy.sparse import csr_matrix

# 定义 GF(256) 中的加法和乘法
def gf_add(a, b):
    return (a + b) % 256

def gf_mul(a, b):
    return (a * b) % 256

# 创建两个稀疏矩阵
data = np.array([1, 2, 3, 4])
row = np.array([0, 0, 1, 2])
col = np.array([0, 2, 2, 0])
A = csr_matrix((data, (row, col)), shape=(3, 3))

data = np.array([5, 6, 7])
row = np.array([0, 1, 2])
col = np.array([1, 1, 2])
B = csr_matrix((data, (row, col)), shape=(3, 3))

# 点乘函数
def sparse_matrix_gf256_multiply(A, B):
    # 获取矩阵的形状和非零元素位置
    rows, cols = A.shape
    data_A = A.data
    data_B = B.data
    indices_A = A.indices
    indptr_A = A.indptr
    indices_B = B.indices
    indptr_B = B.indptr
    
    # 结果矩阵的非零元素存储
    result_data = []
    result_indices = []
    result_indptr = [0]
    
    # 遍历 A 的每一行
    for i in range(rows):
        start_A = indptr_A[i]
        end_A = indptr_A[i + 1]
        for j in range(start_A, end_A):
            a_val = data_A[j]
            a_col = indices_A[j]
            
            # 遍历 B 的对应列
            start_B = indptr_B[a_col]
            end_B = indptr_B[a_col + 1]
            for k in range(start_B, end_B):
                b_val = data_B[k]
                b_row = indices_B[k]
                
                # 计算点乘结果并累加
                if i == b_row:
                    result_data.append(gf_mul(a_val, b_val))
                    result_indices.append(a_col)
        
        # 去重和模运算
        unique_indices = np.unique(result_indices)
        unique_data = np.zeros_like(unique_indices, dtype=np.uint8)
        for idx, val in zip(result_indices, result_data):
            unique_data[np.where(unique_indices == idx)[0][0]] = gf_add(unique_data[np.where(unique_indices == idx)[0][0]], val)
        
        result_data = unique_data.tolist()
        result_indptr.append(len(result_data))
    
    return csr_matrix((result_data, unique_indices, result_indptr), shape=(rows, cols))

# 进行点乘
C = sparse_matrix_gf256_multiply(A, B)
print(C.toarray())

参考链接

Scipy.Sparse 官方文档

通过上述代码,可以在 GF(256) 中实现稀疏矩阵的快速点乘。选择合适的稀疏矩阵格式和优化算法可以进一步提高计算效率。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

scipy.sparse、pandas.sparse、sklearn稀疏矩阵的使用

单机环境下,如果特征较为稀疏且矩阵较大,那么就会出现内存问题,如果不上分布式 + 不用Mars/Dask/CuPy等工具,那么稀疏矩阵就是一条比较容易实现的路。...文章目录 1 scipy.sparse 1.1 SciPy 几种稀疏矩阵类型 1.2 lil_matrix 1.3 矩阵的通用属性 1.4 稀疏矩阵存取 2 pandas.sparse 2.1 SparseArray...2.2 新建SparseDataFrame 2.3 格式转化 2.4 稀疏矩阵的属性 2.5 scipy.sparse与pandas.sparse 3 sklearn 1 scipy.sparse 参考...由于在内存中存储顺序的差异,csc_matrix 矩阵更适合取列切片, 而 csr_matrix 矩阵更适合用来取行切片。...1.2 lil_matrix 这里只说lil_matrix,因为笔者用的这款,且比较方便。 lil_matrix 是第二直观的稀疏矩阵存储方式。

1.8K10

SciPy 稀疏矩阵(5):CSR

然而,LIL 格式的稀疏矩阵并不是最适合进行矩阵乘向量操作的稀疏矩阵格式,它还有优化空间。...如图所示,我们可以发现 LIL 格式的稀疏矩阵虽然可以快速获取某一行的信息,但是它任意相邻两行的非零元素的列索引以及对应元素值并不是存储在一段连续的内存空间中,换句话说就是当缓存中的第 i 行非零元素的信息即将用完的时候...实例化 SciPy CSR 格式的稀疏矩阵类的定义位于 scipy.sparse 包中的 csr_matrix 类,对其进行实例化就能获取一个 SciPy CSR 格式的稀疏矩阵的实例。...因此,我们需要自己实现两种格式的稀疏矩阵的矩阵乘向量操作,这一点也不难,只需要继承 SciPy 中对应格式的稀疏矩阵类并重写 _mul_vector 方法就可以了,代码如下所示。...然而,模仿 LIL 格式的稀疏矩阵格式 SciPy 中并没有实现,大家可以尝试自己去模仿一下,这一点也不难。因此,下回直接介绍模仿 CSR 格式的稀疏矩阵格式——CSC 格式。

16610
  • SciPy 稀疏矩阵(6):CSC

    然而,模仿 LIL 格式的稀疏矩阵格式 SciPy 中并没有实现,大家可以尝试自己去模仿一下,这一点也不难。因此,这回直接介绍模仿 CSR 格式的稀疏矩阵格式——CSC 格式。...实例化 SciPy CSC 格式的稀疏矩阵类的定义位于 scipy.sparse 包中的 csc_matrix 类,对其进行实例化就能获取一个 SciPy CSC 格式的稀疏矩阵的实例。...优缺点 SciPy CSC 格式的稀疏矩阵有着以下优点: 进行算术操作的性能非常高效。 进行列切片操作的性能非常高效。 进行矩阵乘向量运算的操作特别迅速。...对于一个大的稀疏矩阵我们显然也可以进行分块,只不过绝大多数情况下大量的块是元素全为零的矩阵,显然,我们可以通过仅存储非零矩阵块也能实现稀疏矩阵的压缩存储。...然而,SciPy 中仅实现了模仿 CSR 格式的稀疏矩阵格式,模仿其他稀疏矩阵的格式全都没有实现,大家可以尝试自己去模仿一下,这一点也不难。大家可以尝试自己去模仿一下,这一点也不难。

    17410

    c++矩阵类_Matlab与Python的矩阵运算

    本章我们从矩阵运算模块出发,对比Python与Matlab在实现矩阵创建与运算时的异同,以帮助习惯使用Matlab的用户快速熟悉并应用NumPy/SciPy库。   array还是matrix?...1,   Matlab的序列中各元素被视为第1个,第2个,第3个……   a23=A(2,3)   矩阵点乘与元素智能相乘   元素智能相乘即矩阵中各素分别对应相乘-Python_np.array  ...#矩阵点乘,适用于Python 3.5以上版本   -Python_np.martix   #矩阵点乘   -Matlab   B=A*A %矩阵点乘B=A....需要注意的是array生成的1维数组在进行矩阵点乘时,会视其在乘号左侧或右侧转化为对应的1xN或Nx1的矩阵。matrix则无法自动转化。  ...此外由于在array中1xN数组为1维数组,其无法通过上述.T或np.transpose()操作转置成如Nx1矩阵(由于点乘时会自动变形,针对其的转置使用场景不多)。

    1.9K10

    python的高级数组之稀疏矩阵

    稀疏矩阵的定义: 具有少量非零项的矩阵(在矩阵中,若数值0的元素数目远多于非0元素的数目,并且非0元素分布没有规律时,)则称该矩阵为稀疏矩阵;相反,为稠密矩阵。...稀疏矩阵的格式 存储矩阵的一般方法是采用二维数组,其优点是可以随机地访问每一个元素,因而能够容易实现矩阵的各种运算。...对于稀疏矩阵,采用二维数组的存储方法既浪费大量的存储单元来存放零元素,又要在运算中浪费大量的时间来进行零元素的无效运算。因此必须考虑对稀疏矩阵进行压缩存储(只存储非零元素)。...CSR、CSC是用于矩阵-矩阵和矩阵-向量运算的有效格式,LIL格式用于生成和更改稀疏矩阵。Python不能自动创建稀疏矩阵,所以要用scipy中特殊的命令来得到稀疏矩阵。...用LIL格式更改和切割矩阵: LIL格式最适合切片的方法,即以LIL格式提取子矩阵,并通过插入非零元素来改变稀疏模式。

    2.9K10

    【水了一篇】Scipy简单介绍

    SciPy包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。...---- 4 稀疏矩阵 稀疏矩阵(英语:sparse matrix)指的是在数值分析中绝大多数数值为零的矩阵。反之,如果大部分元素都非零,则这个矩阵是稠密的(Dense)。...上述稀疏矩阵仅包含9个非零元素,另外包含26个零元。SciPy的scipy.sparse模块提供了处理稀疏矩阵的函数。...主要使用以下两种类型的稀疏矩阵: CSC-压缩稀疏列(Compressed Sparse Column),按列压缩。 CSR-压缩稀疏行(Compressed Sparse Row),按行压缩。...SciPy通过scipy.spatial模块处理空间数据,比如判断一个点是否在边界内、计算给定点周围距离最近点以及给定距离内的所有点。 这里不详细介绍,请看这里。

    97720

    走过19年,每年千万下载量,科学计算开源库SciPy的前世今生

    SciPy 发展里程碑 20 世纪 90 年代末期,美国梅奥医学中心的博士生 Travis Oliphant 发布了一系列构建于数值数组之上的包,并提供了用于信号处理、特殊函数、稀疏矩阵、正交、最优化和快速傅里叶变换等的算法...这些包中的 Multipack 是一组包装了 Fortran 和 C 语言的扩展模块,用于解决非线性方程和最小二乘问题、求微分方程的积分以及拟合曲线。...数据结构:稀疏矩阵 scipy.sparse 提供了 7 种稀疏矩阵数据结构,或者称之为稀疏格式。其中最重要的一种是压缩行/压缩列的稀疏格式,它们分别为 CSR 与 CSC。...这两种方法都提供了快速的主轴索引与快速的矩阵-向量乘法,这两种稀疏格式在 SciPy 及依赖的库中得到了广泛的应用。...从新特性的角度来看,scipy.sparse 矩阵与线性运算子现在都已经支持 Python 矩阵乘法(@)。

    91631

    走过19年,每年千万下载量,科学计算开源库SciPy的前世今生

    SciPy 发展里程碑 20 世纪 90 年代末期,美国梅奥医学中心的博士生 Travis Oliphant 发布了一系列构建于数值数组之上的包,并提供了用于信号处理、特殊函数、稀疏矩阵、正交、最优化和快速傅里叶变换等的算法...这些包中的 Multipack 是一组包装了 Fortran 和 C 语言的扩展模块,用于解决非线性方程和最小二乘问题、求微分方程的积分以及拟合曲线。...数据结构:稀疏矩阵 scipy.sparse 提供了 7 种稀疏矩阵数据结构,或者称之为稀疏格式。其中最重要的一种是压缩行/压缩列的稀疏格式,它们分别为 CSR 与 CSC。...这两种方法都提供了快速的主轴索引与快速的矩阵-向量乘法,这两种稀疏格式在 SciPy 及依赖的库中得到了广泛的应用。...从新特性的角度来看,scipy.sparse 矩阵与线性运算子现在都已经支持 Python 矩阵乘法(@)。

    72831

    SciPy 稀疏矩阵(3):DOK

    上回说到,COO 格式的稀疏矩阵不支持元素访问的操作,即使我们来自己实现这一操作,这一操作的时间复杂度相对于普通矩阵而言还是太高了!...这种高效性使得散列表在需要快速查找和访问数据的场景中特别有用,比如在搜索引擎的索引中。散列表的基本实现涉及两个主要操作:插入(Insert)和查找(Lookup)。...实例化 SciPy DOK 格式的稀疏矩阵类的定义位于 scipy.sparse 包中的 dok_matrix 类,对其进行实例化就能获取一个 SciPy DOK 格式的稀疏矩阵的实例。...(零元素改非零元素) 增加关键字和对应值 按照行列索引修改对应值(非零元素改零元素) 删除关键字和对应值 优缺点 SciPy DOK 格式的稀疏矩阵有着以下优点: 一点一点(逐个元素或者逐个矩阵块)...至于存储方式也不需要我们去实现,SciPy 已经实现了这样的稀疏矩阵存储方式,它就是另一个板块,这个板块共有 4 种稀疏矩阵格式,分别是{BSR, CSC, CSR, LIL},下一回先介绍 LIL 格式的稀疏矩阵

    37850

    matlab 稀疏矩阵 乘法,Matlab 矩阵运算

    Copyright 2008 说明:这一段时间用Matlab做了LDPC码的性能仿真,过程中涉及了大量的矩阵运算,本文记录了Matlab中矩阵的相关知识,特别的说明了稀疏矩阵和有限域中的矩阵。...(2) 范得蒙矩阵 范得蒙(Vandermonde)矩阵最后一列全为1,倒数第二列为一个指定的向量,其他各列是其后列与倒数第二列的点乘积。可以用一个指定向量生成一个范得蒙矩阵。...如果A矩阵是非奇异方阵,则A\B和B/A运算可以实现。A\B等效于A的逆左乘B 矩阵,也就是inv(A)*B,而B/A等效于A矩阵的逆右乘B矩阵,也就是B*inv(A)。...(5) 矩阵的转置 对实数矩阵进行行列互换,对复数矩阵,共轭转置,特殊的,操作符.’共轭不转置(见点运算); (6) 点运算 在MATLAB中,有一种特殊的运算,因为其运算符是在有关算术运算符前面加点,...二、有限域中的矩阵 信道编码中的矩阵运算一般都是基于有限域的,因此需要将普通矩阵转换为有限域中的矩阵,使其运算在有限域GF(m)中。

    3K30

    【Python环境】Python的数据分析——前言

    它提供了如下内容:快速有效的多维数组对象ndarray,数组之间的运算,基于数组的数据读写到磁盘功能,线代运算,傅里叶变换,随机数生成,将C、C++和Fortran集成到Python的工具。...● pandas pandas提供了丰富的数据结构和功能,可以快速、简单、富于表现地处理结构化数据。它是使Python在数据分析领域强大高效的关键组件之一。...除了终端,在工程中IPython还提供:HTML笔记本来连接浏览器,Qt界面来显示、编辑和高亮,并行和分布式计算的组件。...的线代方程和矩阵分解 ◎ scipy.optimize 方程优化和求根 ◎ scipy.signal 信号处理工具 ◎ scipy.sparse 稀疏矩阵和稀疏线性解决 ◎ scipy.special...是SPECFUN封装,实现了基本函数功能的Fortran库 ◎ scipy.stats 标准连续和离散的概率分布,各种统计检验 ◎ scipy.weave 用内嵌的c++代码来加速数组运算

    95050

    SciPy 稀疏矩阵(2):COO

    上回说到,计算机存储稀疏矩阵的核心思想就是对矩阵中的非零元素的信息进行一个必要的管理。...SciPy COO 格式的稀疏矩阵 在开始 SciPy COO 格式的稀疏矩阵之前我花了一些篇幅讲解稀疏矩阵的三元组存储策略,这主要是因为 SciPy COO 格式的稀疏矩阵用的存储策略就是三元组存储策略的第...01 实例化 SciPy COO 格式的稀疏矩阵类的定义位于 scipy.sparse 包中的 coo_matrix 类,对其进行实例化就能获取一个 SciPy COO 格式的稀疏矩阵的实例。...: 有利于各种稀疏矩阵格式的快速转换。...允许重复的行列索引。 可以高效地构造稀疏矩阵。 在借助稀疏工具的情况下,可以高效地进行矩阵左乘列向量的操作。

    32620

    SciPy库在Anaconda中的配置

    本文介绍在Anaconda环境中,安装Python语言SciPy模块的方法。...scipy.optimize模块包含了这些算法,包括全局优化、最小二乘拟合、非线性方程求解等。 插值:提供了一系列插值方法,用于从有限的数据点中估计连续函数的值。...线性代数:提供了线性代数运算的函数,例如求解线性方程组、计算特征值和特征向量、计算矩阵的逆等。scipy.linalg模块包含了这些函数。...稀疏矩阵:提供了处理大规模稀疏矩阵的函数和工具,包括矩阵的创建、运算、分解等。scipy.sparse模块包含了这些功能。   ...activate py38   运行上述代码,即可进入指定的虚拟环境中。随后,我们输入如下的代码。

    24310

    在 Cython 中高效访问 scipy lil_matrix

    在 Cython 中高效地访问 scipy 的 lil_matrix(LInked List format)可以通过以下步骤实现:导入所需的模块: 首先,导入必要的模块,包括 numpy 和 scipy.sparse...使用 cimport 导入声明: 使用 cimport 声明导入 numpy 和 scipy.sparse 中的 lil_matrix 类。...然而,在 Cython 中访问 scipy 稀疏矩阵时,可能会遇到一些问题。例如,lil_matrix 表示使用不同长度的列表列表。将此类数据结构有效地传递给 Cython(无需复制)可能很困难。...然后,您可以使用 cdef 语句声明变量来存储 scipy 稀疏矩阵。...在这个示例中,我们首先创建了一个 lil_matrix 对象 A,并设置了一些值。然后,我们访问了矩阵的元素,并将其转换为 CSR 格式(压缩稀疏行格式)以进行更高效的操作。

    10410

    机器学习基础与实践(二)——数据转换

    如果数据很小,可以在稀疏矩阵上运用toarray 方法。 2.4 对离群点进行标准化 如果你的数据有离群点(上一篇我们提到过),对数据进行均差和方差的标准化效果并不好。...注:稀疏数据输入: normalize 和 Normalizer 既接受稠密数据(dense array-like),也接受稀疏矩阵(from scipy.sparse)作为输入 稀疏数据需要转换成压缩的稀疏行...此外,在文本处理中也经常会遇到二值特征值(很可能是为了简化概率推理),即使在实际中正则化后的词频或者TF-IDF的值通常只比未正则化的效果好一点点。...注:稀疏数据输入: binarize 和 Binarizer 既接受稠密数据(dense array-like),也接受稀疏矩阵(from scipy.sparse)作为输入 稀疏数据需要转换成压缩的稀疏行...在稀疏矩阵中,缺失值被编码为0存储为矩阵中,这种格式是适合于缺失值比非缺失值多得多的情况。

    1.6K60

    Good Feature Matching: Towards Accurate, Robust VOVSLAM with Low Latency 良好的特征匹配:实现准确、鲁棒的低延迟VOVSLA

    本论文旨在为基于特征的视觉SLAM提高性能效率,提出了一个主动的地图到图像帧的特征匹配算法:特征匹配和一个需要评分的子矩阵选择联系起来,经过仿真,用Max-logDet矩阵评分有最好的表现。...本文提出的算法用于了基于特征点的单目和双目SLAM系统。在多个数据集的表现可量化地表明不降低鲁棒性前提下可减少时延。 ?...GF-ORB-SLAM和ORB-SLAM相比,特征提取时间相同,但是它极大减少了特征匹配和接下来的模块的耗时,在四个系统中延迟最低。...本文主要贡献: 最小二乘位姿优化误差模型的研究,将位姿优化性能和带权重的雅各比矩阵的谱性质联系起来。 将度量指标的探索和位姿优化的最小二乘条件结合起来,选择Max-logDet值最为最优度量。...单目和双目版本实现已开源。

    73010

    Erasure-Code-擦除码-2-实现篇

    现在我们需要找到1个质的多项式([Prime-Polynomial]), 来替代GF(7)中7的角色, 最终得到1个有256个元素的多项式的伽罗华域 GF(2⁸)....满足这些性质的四则运算, 就可以用GF(2⁸)来建立高次曲线, 进而在GF(2⁸)上实现EC. 标准EC的实现 以上讨论的是标准的EC的原理, 现在我们将以上的内容总结, 应用到实践上面....GF(2⁸) 下的加减法直接用异或计算, 不需要其他的工作. GF(2⁸) 下的乘法和除法用查表的方式实现....之所以把单位矩阵也放到编码矩阵上面, 看起来没有什么用, 只是把输入无变化的输出出来的这种风格, 原因在于在编码理论中, 并不是所有的生成的Code都是k个原始数据 和 m个校验数据的形式, 有些编码算法是将...EC的实现到这里就结束了, 有了GF(2⁸)的四则运算实现后, 再通过牛顿消元实现逆矩阵的求解, 就可以完整的实现出一套EC算法了.

    71110

    python 数据标准化常用方法,z-scoremin-max标准化

    唯一可用于稀疏数据 scipy.sparse的标准化 preprocessing.robust_scale(X,axis=0, with_centering=True, with_scaling=True...=(0, 1),copy=True): 将数据在缩放在固定区间的类,默认缩放到区间 [0, 1],对于方差非常小的属性可以增强其稳定性,维持稀疏矩阵中为0的条目 属性: min_:ndarray,缩放后的最小值偏移量...属性: center_:ndarray,中心点 scale_:ndarray,缩放比例 classpreprocessing.KernelCenterer: 生成 kernel 矩阵,用于将 svm...可用于稀疏数据 scipy.sparse classpreprocessing.Normalizer(norm='l2', copy=True): 数据归一化的类。...scipy.sparse classpreprocessing.Binarizer(threshold=0.0,copy=True): 二值化处理的类,可用于稀疏数据 scipy.sparse 方法:

    17K62

    10行代码搞定图Transformer,图神经网络框架DGL迎来1.0版本

    DGL Sparse:为图机器学习设计的稀疏矩阵库 DGL 1.0 版本中新增了一个名为 DGL Sparse 的库(dgl.sparse),它和 DGL 中的消息传递接口一起,完善了对于全类型的图神经网络模型的支持...在下一节中,作者演示多个 GNN 示例,展示它们在 DGL Sparse 中的数学公式和相应的代码实现。...图卷积网络(Graph Convolutional Network) GCN 是 GNN 建模的先驱之一。GCN 可以同时用消息传递视图和矩阵视图来表示。...超图的典型特征是其稀疏的关联矩阵,因此超图神经网络 (HGNN) 通常使用稀疏矩阵定义。以下是超图卷积网络(Feng et al., 2018)和其代码实现。...DGL Sparse 的关键特性 相比 scipy.sparse 或 torch.sparse 等稀疏矩阵库,DGL Sparse 的整体设计是为图机器学习服务,其中包括了以下关键特性: 自动稀疏格式选择

    83230

    压缩感知“Hello World”代码初步学习

    时域测试信号生成 K=7; % 稀疏度(做FFT可以看出来) N=256; % 信号长度 M=64; % 测量数(M>=K*log(N/K),至少40,但有出错的概率...对于用矩阵形式表达的线性方程组: 它的最小二乘解为: 其中 即为矩阵G的最小二乘广义逆(广义逆的一种)。...有了这些知识背景后代码就容易理解了,在第三步中,得到矩阵T中的与残差r_n最相关的列组成的矩阵Aug_t,而第四步实际上就是在求方程组Aug_t*Aug_y=s的最小二乘解。...r_n=s-Aug_t*aug_y;这一句就是用求得的最小二乘解更新残差r_n,在下一次迭代中使用。...hat_y(pos_array)=aug_y; 最后一次迭代得到的最小二乘解aug_y即为恢复的值,位置分别对应于迭代中每一次与残差r_s最相关的矩阵T的列号。

    1.5K70
    领券