力扣2961.双模幂运算随笔

“通其变,天下无弊法;执其方,天下无善教。”——【隋】王通

题目

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

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

  • 0 <= i < variables.length
  • (({a_i}^{b_i} \bmod 10)^{c_i}) \bmod m_i == target

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

难度:中等

分析

        过去学的东西变了一点(或者说过去明明学过)就忘了,令人失望(;′⌒`),希望借此题警醒自己。此题在数学公式上没有什么特别的运算,无非就是优化幂的计算规模和速度。在使用快速幂的基础上,由于有取模运算的存在,可以将大数缩减为小数进行运算,遵照(a * b) % c = (a % c) * (b % c) % c,或者可以这么理解:一个数是a的倍数,那么不论它自身多次相乘或是与其他数相乘,结果都是a的倍数。体现在具体过程中就是可以将底数取模(注意不要把指数取模)。

解答

class Solution {
public:
    vector<int> getGoodIndices(vector<vector<int>>& variables, int target) {
        vector<int> ans;
        for (int i=0;i<variables.size();i++){
            auto v=variables[i];
            int temp=pow(v[0],v[1],10);
            if (pow(temp,v[2],v[3])==target){
                ans.push_back(i);
            }
        }
        return ans;
    }

    //快速幂取模
    int pow(int x,int y,int mod){
        x%=mod;
        int ans=1;
        while (y){
            if (y&1){
                ans=(x*ans)%mod;
            }
            x=(x*x)%mod;
            y>>=1;
        }
        return ans;
    }
};

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值