矩阵中不重复的元素 (指数转换成对数,去重)

探讨了一种算法,用于计算特殊形式矩阵中不重复元素的数量。矩阵由指数运算生成,通过转换为对数运算并利用map数据结构进行元素去重。

一个m*n的矩阵。

 

该矩阵的第一列是a^b,(a+1)^b,.....(a + n - 1)^b

第二列是a^(b+1),(a+1)^(b+1),.....(a + n - 1)^(b+1)

.......

第m列是a^(b + m - 1),(a+1)^(b + m - 1),.....(a + n - 1)^(b + m - 1)

(a^b表示a的b次方)

 

下面是一个4*4的矩阵:

 

2^2=4, 2^3=8, 2^4=16, 2^5=32

3^2=9, 3^3=27, 3^4=81, 3^5=243

4^2=16, 4^3=64, 4^4=256, 4^5=1024

5^2=25, 5^3=125, 5^4=625, 5^5=3125

 

问这个矩阵里有多少不重复的数(比如4^3 = 8^2,这样的话就有重复了)

 

2^2=4, 2^3=8, 2^4=16, 2^5=32

3^2=9, 3^3=27, 3^4=81, 3^5=243

4^2=16, 4^3=64, 4^4=256, 4^5=1024

 

m = 4, n = 3, a = 2, b = 2。其中2^4与4^2是重复的元素。

 收起

输入

输入数据包括4个数:m,n,a,b。中间用空格分隔。m,n为矩阵的长和宽(2 <= m,n <= 100)。a,b为矩阵的第1个元素,a^b(2 <= a , b <= 100)。

输出

输出不重复元素的数量。

输入样例

4 3 2 2

输出样例

11

矩阵:

 

思路:因为是指数,所以我们可以转换成对数来计算:

    a^b=x;
    b=loga(x);
    b=log2(x)/log2(a);
    log2(x)=b * log2(a);

 

再用map去重即可。

代码如下:

/*
    a^b=x;
    b=loga(x);
    b=log2(x)/log2(a);
    log2(x)=b * log2(a);
*/

#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
map<double,int>v;
void ex_mod(int x,int n)
{
    double res = n *log2(x+0.0);
    v[res]=1;
}
int main()
{
    int m,n,a,b;
    cin>>m>>n>>a>>b;
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            ex_mod(a+j,b+i);
    printf("%d\n",v.size());
}

 

以下是针对你提出的11个Python(NumPy)相关问题的详细解答,使用 `numpy` 库完成所有操作。每个问题都附有代码实现和解释。 --- ### 1. 创建一个一维的向量a,其值的范围从10到49 ```python import numpy as np a = np.arange(10, 50) print("向量a:", a) ``` **解释**:`np.arange(start, stop)` 生成从 `start` 到 `stop-1` 的整数序列。这从10到49(包含10,包含50),共40个元素。 --- ### 2. 创建一个大小为10的空向量arr1(元素全为0),但第五个值为1 ```python arr1 = np.zeros(10) arr1[4] = 1 # 索引从0开始,第5个元素是索引4 print("arr1:", arr1) ``` **解释**:`np.zeros(10)` 创建长度为10的零向量,然后通过索引赋值修改第5个元素为1。 --- ### 3. 将第1题中的向量a反转(第一个元素变为最后一个) ```python a_reversed = a[::-1] print("反转后的a:", a_reversed) ``` **解释**:切片 `[::-1]` 表示逆序遍历数组,实现反转。 --- ### 4. 创建一个6*6的矩阵arr2,值范围从10到35 ```python arr2 = np.arange(10, 46).reshape(6, 6) print("6x6矩阵arr2:\n", arr2) ``` **解释**:需要36个数(6×6=36),从10开始取36个连续整数(即到45),然后用 `.reshape(6,6)` 转成6行6列矩阵。 > 注意:题目说“值范围从10到35”,但如果严格只取10~35只有26个数,够填满6×6=36个位置。因此合理理解应为 **从10开始连续填充36个数**,直到45。若确实要求数据在10~35之间,请说明是否允许重复或随机采样。此处按顺序构造完整矩阵处理。 --- ### 5. 找到非零元素在向量a: [1, 2, 0, 0, 4, 0]中的索引 ```python a_test = np.array([1, 2, 0, 0, 4, 0]) non_zero_indices = np.nonzero(a_test)[0] print("非零元素的索引:", non_zero_indices) ``` **解释**:`np.nonzero()` 返回非零元素的索引元组,对于一维数组,取 `[0]` 即可得到索引数组。 --- ### 6. 提取数组a1 [1,2,0,3,2,0,4,1,2]中所有大于平均值的数据 ```python a1 = np.array([1, 2, 0, 3, 2, 0, 4, 1, 2]) mean_val = a1.mean() result = a1[a1 > mean_val] print("大于平均值的元素:", result) ``` **解释**:先计算均值,再使用布尔索引筛选出大于均值的元素。 --- ### 7. 建立一个随机的有8个元素的一维数组arr,服从均匀分布[-10,10],并向上取整(注意是“向外取整”) ```python np.random.seed(None) # 可选:置种子 arr = np.random.uniform(-10, 10, size=8) arr_ceil = np.ceil(arr) # 向正无穷方向取整(负数向下,如 -8.2 → -8?对!) # 但题目要求:“-8.2155取整为-9, 1.42811取整为2” —— 这是“向远离0的方向”取整,即朝符号方向进位,称为“向上取整”对正数,“向下取整”对负数? # 实际上这是 **向远离零的方向进位**,等价于: # 使用 np.sign(x) * np.ceil(abs(x)) arr_outward = np.where(arr >= 0, np.ceil(arr), np.floor(arr)) print("原始arr:", arr) print("向外取整后:", arr_outward) ``` **解释**:题目中的“向外取整”是指朝绝对值增大的方向取整: - 正数:向上取整(1.428 → 2)→ `ceil` - 负数:向下取整(-8.215 → -9)→ `floor` 所以可以用条件判断或结合 `sign` 和 `ceil(abs())` 来实现。 更简洁写法: ```python arr_outward = np.sign(arr) * np.ceil(np.abs(arr)) ``` 这也能达到相同效果。 --- ### 8. 对数组a进行归一化和标准化处理 ```python a = np.array([10, 20, 30, 40, 50]) # 归一化 (Min-Max normalization): (x - min) / (max - min) normalized = (a - a.min()) / (a.max() - a.min()) # 标准化 (Z-score normalization): (x - mean) / std standardized = (a - a.mean()) / a.std() print("归一化结果:", normalized) print("标准化结果:", standardized) ``` **解释**: - **归一化**将数据缩放到 [0,1] 区间; - **标准化**使数据均值为0,标准差为1,适用于高斯分布假设模型。 --- ### 9. 建立二维随机整数数组a1,范围10-100,种子为5;按行、列排序 ```python np.random.seed(5) a1 = np.random.randint(10, 101, size=(4, 5)) # 示例4行5列 print("原始a1:\n", a1) # 按行排序(每行内部排序) a1_sorted_by_row = np.sort(a1, axis=1) print("按行排序:\n", a1_sorted_by_row) # 按列排序(每列内部排序) a1_sorted_by_col = np.sort(a1, axis=0) print("按列排序:\n", a1_sorted_by_col) ``` **解释**: - `axis=1` 表示沿行方向排序(即对每一行内的元素排序); - `axis=0` 表示沿列方向排序(即对每一列内的元素排序); - `np.random.randint(low, high, size)` 生成 [low, high) 的随机整数。 --- ### 10. 数组a2中找出出现过的元素,并按顺序排列保存至变量b ```python a2 = np.array([4, 5, 4, 1, 2, 3, 6, 2, 1, 2, 3, 4, 5]) b = np.unique(a2) print("并排序后的b:", b) ``` **解释**:`np.unique()` 默认会返回已排序的唯一值,正好满足“找出出现过的元素并按顺序排列”。 --- ### 11. 已知数组b中有NaN,检测是否有NaN值 ```python b = np.array([1, 2, 0, 3, 2, np.nan, 4, 1, np.nan], dtype=float) has_nan = np.isnan(b).any() print("数组b中是否存在NaN?", has_nan) ``` **解释**:`np.isnan()` 返回布尔数组,标记哪些位置是 `NaN`;`.any()` 判断是否存在至少一个 `True`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值