“通其变,天下无弊法;执其方,天下无善教。”——【隋】王通
题目
给你一个下标从 0 开始的二维数组 variables
,其中 variables[i] = [ai, bi, ci, mi]
,以及一个整数 target
。
如果满足以下公式,则下标 i
是 好下标:
0 <= i < variables.length
返回一个由 好下标 组成的数组,顺序不限 。
难度:中等
分析
过去学的东西变了一点(或者说过去明明学过)就忘了,令人失望(;′⌒`),希望借此题警醒自己。此题在数学公式上没有什么特别的运算,无非就是优化幂的计算规模和速度。在使用快速幂的基础上,由于有取模运算的存在,可以将大数缩减为小数进行运算,遵照(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;
}
};