Skip to content

Commit 433bf34

Browse files
authoredSep 14, 2023
feat: add solutions to lc problem: No.0372 (doocs#1623)
1 parent c069c06 commit 433bf34

File tree

7 files changed

+221
-164
lines changed

7 files changed

+221
-164
lines changed
 

‎solution/0300-0399/0372.Super Pow/README.md

+73-47
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,15 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56-
乘方快速幂。
56+
**方法一:快速幂**
57+
58+
我们初始化答案变量 $ans = 1$。
59+
60+
接下来,倒序遍历数组 $b$,每次遍历到一个元素 $e$,我们将答案变量 $ans$ 自乘 $a^e$ 并对 $1337$ 取模,然后将 $a$ 自乘 $10$ 次并对 $1337$ 取模。这里需要用到快速幂。
61+
62+
遍历完数组后,返回答案即可。
63+
64+
时间复杂度 $O(\sum_{i=0}^{n-1} \log b_i)$,空间复杂度 $O(1)$。
5765

5866
<!-- tabs:start -->
5967

@@ -64,11 +72,11 @@
6472
```python
6573
class Solution:
6674
def superPow(self, a: int, b: List[int]) -> int:
67-
MOD = 1337
75+
mod = 1337
6876
ans = 1
6977
for e in b[::-1]:
70-
ans = ans * pow(a, e, MOD) % MOD
71-
a = pow(a, 10, MOD)
78+
ans = ans * pow(a, e, mod) % mod
79+
a = pow(a, 10, mod)
7280
return ans
7381
```
7482

@@ -78,25 +86,24 @@ class Solution:
7886

7987
```java
8088
class Solution {
81-
private static final int MOD = 1337;
89+
private final int mod = 1337;
8290

8391
public int superPow(int a, int[] b) {
84-
int ans = 1;
92+
long ans = 1;
8593
for (int i = b.length - 1; i >= 0; --i) {
86-
ans = (int) ((long) ans * quickPowAndMod(a, b[i]) % MOD);
87-
a = quickPowAndMod(a, 10);
94+
ans = ans * qpow(a, b[i]) % mod;
95+
a = qpow(a, 10);
8896
}
89-
return ans;
97+
return (int) ans;
9098
}
9199

92-
private int quickPowAndMod(int a, int b) {
93-
int ans = 1;
94-
while (b > 0) {
95-
if ((b & 1) == 1) {
96-
ans = (ans * (a % MOD)) % MOD;
100+
private long qpow(long a, int n) {
101+
long ans = 1;
102+
for (; n > 0; n >>= 1) {
103+
if ((n & 1) == 1) {
104+
ans = ans * a % mod;
97105
}
98-
b >>= 1;
99-
a = (a % MOD) * (a % MOD) % MOD;
106+
a = a * a % mod;
100107
}
101108
return ans;
102109
}
@@ -107,26 +114,24 @@ class Solution {
107114

108115
```cpp
109116
class Solution {
110-
const int MOD = 1337;
111-
112117
public:
113118
int superPow(int a, vector<int>& b) {
114-
int ans = 1;
115-
for (int i = b.size() - 1; i >= 0; --i) {
116-
ans = (long) ans * quickPowAndMod(a, b[i]) % MOD;
117-
a = quickPowAndMod(a, 10);
118-
}
119-
return ans;
120-
}
121-
122-
int quickPowAndMod(int a, int b) {
123-
int ans = 1;
124-
while (b) {
125-
if (b & 1) {
126-
ans = (ans * (a % MOD)) % MOD;
119+
using ll = long long;
120+
const int mod = 1337;
121+
ll ans = 1;
122+
auto qpow = [&](ll a, int n) {
123+
ll ans = 1;
124+
for (; n; n >>= 1) {
125+
if (n & 1) {
126+
ans = ans * a % mod;
127+
}
128+
a = a * a % mod;
127129
}
128-
b >>= 1;
129-
a = ((a % MOD) * (a % MOD)) % MOD;
130+
return (int) ans;
131+
};
132+
for (int i = b.size() - 1; ~i; --i) {
133+
ans = ans * qpow(a, b[i]) % mod;
134+
a = qpow(a, 10);
130135
}
131136
return ans;
132137
}
@@ -136,27 +141,48 @@ public:
136141
### **Go**
137142
138143
```go
139-
const mod = 1337
140-
141144
func superPow(a int, b []int) int {
145+
const mod int = 1337
142146
ans := 1
147+
qpow := func(a, n int) int {
148+
ans := 1
149+
for ; n > 0; n >>= 1 {
150+
if n&1 == 1 {
151+
ans = ans * a % mod
152+
}
153+
a = a * a % mod
154+
}
155+
return ans
156+
}
143157
for i := len(b) - 1; i >= 0; i-- {
144-
ans = ans * quickPowAndMod(a, b[i]) % mod
145-
a = quickPowAndMod(a, 10)
158+
ans = ans * qpow(a, b[i]) % mod
159+
a = qpow(a, 10)
146160
}
147161
return ans
148162
}
163+
```
149164

150-
func quickPowAndMod(a, b int) int {
151-
ans := 1
152-
for b > 0 {
153-
if b&1 > 0 {
154-
ans = ans * a % mod
155-
}
156-
b >>= 1
157-
a = ((a % mod) * (a % mod)) % mod
158-
}
159-
return ans
165+
### **TypeScript**
166+
167+
```ts
168+
function superPow(a: number, b: number[]): number {
169+
let ans = 1;
170+
const mod = 1337;
171+
const qpow = (a: number, n: number): number => {
172+
let ans = 1;
173+
for (; n; n >>= 1) {
174+
if (n & 1) {
175+
ans = Number((BigInt(ans) * BigInt(a)) % BigInt(mod));
176+
}
177+
a = Number((BigInt(a) * BigInt(a)) % BigInt(mod));
178+
}
179+
return ans;
180+
};
181+
for (let i = b.length - 1; ~i; --i) {
182+
ans = Number((BigInt(ans) * BigInt(qpow(a, b[i]))) % BigInt(mod));
183+
a = qpow(a, 10);
184+
}
185+
return ans;
160186
}
161187
```
162188

‎solution/0300-0399/0372.Super Pow/README_EN.md

+64-46
Original file line numberDiff line numberDiff line change
@@ -47,37 +47,36 @@
4747
```python
4848
class Solution:
4949
def superPow(self, a: int, b: List[int]) -> int:
50-
MOD = 1337
50+
mod = 1337
5151
ans = 1
5252
for e in b[::-1]:
53-
ans = ans * pow(a, e, MOD) % MOD
54-
a = pow(a, 10, MOD)
53+
ans = ans * pow(a, e, mod) % mod
54+
a = pow(a, 10, mod)
5555
return ans
5656
```
5757

5858
### **Java**
5959

6060
```java
6161
class Solution {
62-
private static final int MOD = 1337;
62+
private final int mod = 1337;
6363

6464
public int superPow(int a, int[] b) {
65-
int ans = 1;
65+
long ans = 1;
6666
for (int i = b.length - 1; i >= 0; --i) {
67-
ans = (int) ((long) ans * quickPowAndMod(a, b[i]) % MOD);
68-
a = quickPowAndMod(a, 10);
67+
ans = ans * qpow(a, b[i]) % mod;
68+
a = qpow(a, 10);
6969
}
70-
return ans;
70+
return (int) ans;
7171
}
7272

73-
private int quickPowAndMod(int a, int b) {
74-
int ans = 1;
75-
while (b > 0) {
76-
if ((b & 1) == 1) {
77-
ans = (ans * (a % MOD)) % MOD;
73+
private long qpow(long a, int n) {
74+
long ans = 1;
75+
for (; n > 0; n >>= 1) {
76+
if ((n & 1) == 1) {
77+
ans = ans * a % mod;
7878
}
79-
b >>= 1;
80-
a = (a % MOD) * (a % MOD) % MOD;
79+
a = a * a % mod;
8180
}
8281
return ans;
8382
}
@@ -88,26 +87,24 @@ class Solution {
8887

8988
```cpp
9089
class Solution {
91-
const int MOD = 1337;
92-
9390
public:
9491
int superPow(int a, vector<int>& b) {
95-
int ans = 1;
96-
for (int i = b.size() - 1; i >= 0; --i) {
97-
ans = (long) ans * quickPowAndMod(a, b[i]) % MOD;
98-
a = quickPowAndMod(a, 10);
99-
}
100-
return ans;
101-
}
102-
103-
int quickPowAndMod(int a, int b) {
104-
int ans = 1;
105-
while (b) {
106-
if (b & 1) {
107-
ans = (ans * (a % MOD)) % MOD;
92+
using ll = long long;
93+
const int mod = 1337;
94+
ll ans = 1;
95+
auto qpow = [&](ll a, int n) {
96+
ll ans = 1;
97+
for (; n; n >>= 1) {
98+
if (n & 1) {
99+
ans = ans * a % mod;
100+
}
101+
a = a * a % mod;
108102
}
109-
b >>= 1;
110-
a = ((a % MOD) * (a % MOD)) % MOD;
103+
return (int) ans;
104+
};
105+
for (int i = b.size() - 1; ~i; --i) {
106+
ans = ans * qpow(a, b[i]) % mod;
107+
a = qpow(a, 10);
111108
}
112109
return ans;
113110
}
@@ -117,27 +114,48 @@ public:
117114
### **Go**
118115
119116
```go
120-
const mod = 1337
121-
122117
func superPow(a int, b []int) int {
118+
const mod int = 1337
123119
ans := 1
120+
qpow := func(a, n int) int {
121+
ans := 1
122+
for ; n > 0; n >>= 1 {
123+
if n&1 == 1 {
124+
ans = ans * a % mod
125+
}
126+
a = a * a % mod
127+
}
128+
return ans
129+
}
124130
for i := len(b) - 1; i >= 0; i-- {
125-
ans = ans * quickPowAndMod(a, b[i]) % mod
126-
a = quickPowAndMod(a, 10)
131+
ans = ans * qpow(a, b[i]) % mod
132+
a = qpow(a, 10)
127133
}
128134
return ans
129135
}
136+
```
130137

131-
func quickPowAndMod(a, b int) int {
132-
ans := 1
133-
for b > 0 {
134-
if b&1 > 0 {
135-
ans = ans * a % mod
136-
}
137-
b >>= 1
138-
a = ((a % mod) * (a % mod)) % mod
139-
}
140-
return ans
138+
### **TypeScript**
139+
140+
```ts
141+
function superPow(a: number, b: number[]): number {
142+
let ans = 1;
143+
const mod = 1337;
144+
const qpow = (a: number, n: number): number => {
145+
let ans = 1;
146+
for (; n; n >>= 1) {
147+
if (n & 1) {
148+
ans = Number((BigInt(ans) * BigInt(a)) % BigInt(mod));
149+
}
150+
a = Number((BigInt(a) * BigInt(a)) % BigInt(mod));
151+
}
152+
return ans;
153+
};
154+
for (let i = b.length - 1; ~i; --i) {
155+
ans = Number((BigInt(ans) * BigInt(qpow(a, b[i]))) % BigInt(mod));
156+
a = qpow(a, 10);
157+
}
158+
return ans;
141159
}
142160
```
143161

+22-24
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,23 @@
1-
class Solution {
2-
const int MOD = 1337;
3-
4-
public:
5-
int superPow(int a, vector<int>& b) {
6-
int ans = 1;
7-
for (int i = b.size() - 1; i >= 0; --i) {
8-
ans = (long) ans * quickPowAndMod(a, b[i]) % MOD;
9-
a = quickPowAndMod(a, 10);
10-
}
11-
return ans;
12-
}
13-
14-
int quickPowAndMod(int a, int b) {
15-
int ans = 1;
16-
while (b) {
17-
if (b & 1) {
18-
ans = (ans * (a % MOD)) % MOD;
19-
}
20-
b >>= 1;
21-
a = ((a % MOD) * (a % MOD)) % MOD;
22-
}
23-
return ans;
24-
}
1+
class Solution {
2+
public:
3+
int superPow(int a, vector<int>& b) {
4+
using ll = long long;
5+
const int mod = 1337;
6+
ll ans = 1;
7+
auto qpow = [&](ll a, int n) {
8+
ll ans = 1;
9+
for (; n; n >>= 1) {
10+
if (n & 1) {
11+
ans = ans * a % mod;
12+
}
13+
a = a * a % mod;
14+
}
15+
return (int) ans;
16+
};
17+
for (int i = b.size() - 1; ~i; --i) {
18+
ans = ans * qpow(a, b[i]) % mod;
19+
a = qpow(a, 10);
20+
}
21+
return ans;
22+
}
2523
};

0 commit comments

Comments
 (0)
Please sign in to comment.