您的位置:首页 > 文旅 > 旅游 > 力扣刷题之2961.双模幂运算

力扣刷题之2961.双模幂运算

2025/3/24 4:01:32 来源:https://blog.csdn.net/m0_75213259/article/details/140809331  浏览:    关键词:力扣刷题之2961.双模幂运算

题干描述

给你一个下标从 开始的二维数组 variables ,其中 variables[i] = [ai, bi, ci, mi],以及一个整数 target 。

如果满足以下公式,则下标 i 是 好下标

  • 0 <= i < variables.length
  • ((aibi % 10)ci) % mi == target

返回一个由 好下标 组成的数组,顺序不限 。

示例 1:

输入:variables = [[2,3,3,10],[3,3,3,1],[6,1,1,4]], target = 2
输出:[0,2]
解释:对于 variables 数组中的每个下标 i :
1) 对于下标 0 ,variables[0] = [2,3,3,10] ,(23 % 10)3 % 10 = 2 。
2) 对于下标 1 ,variables[1] = [3,3,3,1] ,(33 % 10)3 % 1 = 0 。
3) 对于下标 2 ,variables[2] = [6,1,1,4] ,(61 % 10)1 % 4 = 2 。
因此,返回 [0,2] 作为答案。

示例 2:

输入:variables = [[39,3,1000,1000]], target = 17
输出:[]
解释:对于 variables 数组中的每个下标 i :
1) 对于下标 0 ,variables[0] = [39,3,1000,1000] ,(393 % 10)1000 % 1000 = 1 。
因此,返回 [] 作为答案。

题干解析

我们需要判断二维数组 variables 中的每个元素是否满足如下公式:

  • 0 <= i < variables.length
  • ((aibi % 10)ci) % mi == target

如果满足,则该下标 i 是一个好下标,我们需要返回所有好下标的数组。

解题步骤

1.遍历每个元素:我们需要遍历variables数组中的每个元素[a_i, b_i, c_i, m_i]
2.计算中间结果
  • 先计算 ai*bi%10
  • 使用快速幂算法计算 (ai*bi%10)^ci%mi。
3.判断是否符合条件:如果上述计算结果等于target,则该下标是一个好下标。
4.记录好下标:将所有符合条件的下标记录到结果数组中。
5.返回结果:返回包含所有号下标的数组 

代码实现 

#include <stdio.h>
#include <stdlib.h>// 快速幂模运算函数:计算 (x^y) % mod
int pow_mod(int x, int y, int mod) {int res = 1;while (y) {if (y & 1) { // 如果 y 是奇数res = (res * x) % mod;}x = (x * x) % mod; // 平方底数y >>= 1; // 右移一位,相当于 y // 2}return res;
}/*** Note: The returned array must be malloced, assume caller calls free().* 函数:找到所有符合条件的好下标* @param variables: 二维整数数组,表示每个变量的值* @param variablesSize: 数组variables的大小* @param variablesColSize: 数组variables每一行的大小* @param target: 目标值* @param returnSize: 返回数组的大小* @return: 返回符合条件的好下标数组*/
int* getGoodIndices(int** variables, int variablesSize, int* variablesColSize, int target, int* returnSize) {int *ans = (int *)malloc(sizeof(int) * variablesSize); // 分配最大可能的空间int pos = 0; // 记录符合条件的下标个数for (int i = 0; i < variablesSize; i++) {int *v = variables[i];// 计算 (a_i * b_i % 10)int abMod10 = (v[0] * v[1]) % 10;// 计算 ((a_i * b_i % 10)^c_i % m_i)if (pow_mod(abMod10, v[2], v[3]) == target) {ans[pos++] = i;}}*returnSize = pos; // 设置返回的数组大小return ans;
}int main() {// 示例 1int variablesSize = 3;int variablesColSize[] = {4, 4, 4};int* variables[] = {(int[]){2, 3, 3, 10},(int[]){3, 3, 3, 1},(int[]){6, 1, 1, 4}};int target = 2;// 调用getGoodIndices函数,并获取结果int returnSize;int* result = getGoodIndices(variables, variablesSize, variablesColSize, target, &returnSize);// 输出结果数组printf("示例 1 结果: ");for (int i = 0; i < returnSize; i++) {printf("%d ", result[i]);}printf("\n");free(result);// 示例 2int variables2Size = 1;int variables2ColSize[] = {4};int* variables2[] = {(int[]){39, 3, 1000, 1000}};target = 17;// 调用getGoodIndices函数,并获取结果result = getGoodIndices(variables2, variables2Size, variables2ColSize, target, &returnSize);// 输出结果数组printf("示例 2 结果: ");for (int i = 0; i < returnSize; i++) {printf("%d ", result[i]);}printf("\n");free(result);return 0;
}

函数解释

1.pow_mod函数
  • 使用快速幂算法计算(x^y)%mod.
  • 通过不断平方底数并将指数减半来高效计算大幂次方的模运算结果。
2.getGoodIndices函数
  • 遍历variables数组中的每个元素[a_i, b_i, c_i, m_i]。
  • 首先计算ai*bi%10。
  • 然后计算(ai*bi%10)^ci%mi,并与target进行比较。
  • 如果相等,将当前下标i存入结果数组ans。
  • 最后返回包含所有好下标的数组。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com