🔗 🟡 2961. Double Modular Exponentiation 1451

tags: Weekly Contest 375 陣列(Array) 數學(Math) 模擬(Simulation)

題意

給定一個二維陣列 variablesvariables ,其中 variables[i]=[ai,bi,ci,mi]variables[i] = [a_i, b_i, c_i, m_i],以及一個整數 targettarget。求滿足 ((aibimod10)cimodmi)=target((a_i^{b_i} \mod 10)^{c_i} \mod m_i) = targetii 的集合,以陣列的方式返回,順序不限

約束條件

  • 1variables.length1001 \leq variables.length \leq 100
  • variables[i]=[ai,bi,ci,mi]variables[i] = [a_i, b_i, c_i, m_i]
  • 0ai,bi,ci,mi1030 \leq a_i, b_i, c_i, m_i \leq 10^3
  • 0target1030 \leq target \leq 10^3

思路:使用快速冪模擬

對於每個 ii,計算 ((aibimod10)cimodmi)((a_i^{b_i} \mod 10)^{c_i} \mod m_i) ,如果計算結果等於 targettarget,則將下標 ii 加入答案陣列中。

而計算 pow(a,b,m)pow(a, b, m) 可以使用 快速冪(平方求冪) 計算,時間複雜度 O(logb)O(\log b)

python 中,內建的 pow 函數已經內置了快速冪,直接使用即可,其他語言需要自己實現。

複雜度分析

  • 時間複雜度 O(nlogU)O(n \log U),其中 nnvariablesvariables 的長度, UUbi,cib_i, c_i 的最大值,本題中最大值為 10310^3
  • 空間複雜度 O(1)O(1),不考慮答案的空間複雜度。
1
2
3
4
5
6
7
class Solution:
def getGoodIndices(self, variables: List[List[int]], target: int) -> List[int]:
ans = []
for i, (a, b, c, m) in enumerate(variables):
if pow(pow(a, b, 10), c, m) == target:
ans.append(i)
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
vector<int> getGoodIndices(vector<vector<int>>& variables, int target) {
int n = variables.size();
vector<int> ans;
for (int i = 0; i < n; i++) {
int a = variables[i][0], b = variables[i][1], c = variables[i][2], m = variables[i][3];
if (my_pow(my_pow(a, b, 10), c, m) == target) {
ans.push_back(i);
}
}
return ans;
}
int my_pow(int a, int b, int m) {
int ans = 1;
while (b) {
if (b & 1) {
ans = (ans * a) % m;
}
a = (a * a) % m;
b >>= 1;
}
return ans;
}
};

寫在最後

Cover photo is remixed from @吃肥皂泡泡, thanks for their work!