Skip to content

feat: add solutions to lc problem: No.0372 #1623

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 73 additions & 47 deletions solution/0300-0399/0372.Super Pow/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,15 @@

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

乘方快速幂。
**方法一:快速幂**

我们初始化答案变量 $ans = 1$。

接下来,倒序遍历数组 $b$,每次遍历到一个元素 $e$,我们将答案变量 $ans$ 自乘 $a^e$ 并对 $1337$ 取模,然后将 $a$ 自乘 $10$ 次并对 $1337$ 取模。这里需要用到快速幂。

遍历完数组后,返回答案即可。

时间复杂度 $O(\sum_{i=0}^{n-1} \log b_i)$,空间复杂度 $O(1)$。

<!-- tabs:start -->

Expand All @@ -64,11 +72,11 @@
```python
class Solution:
def superPow(self, a: int, b: List[int]) -> int:
MOD = 1337
mod = 1337
ans = 1
for e in b[::-1]:
ans = ans * pow(a, e, MOD) % MOD
a = pow(a, 10, MOD)
ans = ans * pow(a, e, mod) % mod
a = pow(a, 10, mod)
return ans
```

Expand All @@ -78,25 +86,24 @@ class Solution:

```java
class Solution {
private static final int MOD = 1337;
private final int mod = 1337;

public int superPow(int a, int[] b) {
int ans = 1;
long ans = 1;
for (int i = b.length - 1; i >= 0; --i) {
ans = (int) ((long) ans * quickPowAndMod(a, b[i]) % MOD);
a = quickPowAndMod(a, 10);
ans = ans * qpow(a, b[i]) % mod;
a = qpow(a, 10);
}
return ans;
return (int) ans;
}

private int quickPowAndMod(int a, int b) {
int ans = 1;
while (b > 0) {
if ((b & 1) == 1) {
ans = (ans * (a % MOD)) % MOD;
private long qpow(long a, int n) {
long ans = 1;
for (; n > 0; n >>= 1) {
if ((n & 1) == 1) {
ans = ans * a % mod;
}
b >>= 1;
a = (a % MOD) * (a % MOD) % MOD;
a = a * a % mod;
}
return ans;
}
Expand All @@ -107,26 +114,24 @@ class Solution {

```cpp
class Solution {
const int MOD = 1337;

public:
int superPow(int a, vector<int>& b) {
int ans = 1;
for (int i = b.size() - 1; i >= 0; --i) {
ans = (long) ans * quickPowAndMod(a, b[i]) % MOD;
a = quickPowAndMod(a, 10);
}
return ans;
}

int quickPowAndMod(int a, int b) {
int ans = 1;
while (b) {
if (b & 1) {
ans = (ans * (a % MOD)) % MOD;
using ll = long long;
const int mod = 1337;
ll ans = 1;
auto qpow = [&](ll a, int n) {
ll ans = 1;
for (; n; n >>= 1) {
if (n & 1) {
ans = ans * a % mod;
}
a = a * a % mod;
}
b >>= 1;
a = ((a % MOD) * (a % MOD)) % MOD;
return (int) ans;
};
for (int i = b.size() - 1; ~i; --i) {
ans = ans * qpow(a, b[i]) % mod;
a = qpow(a, 10);
}
return ans;
}
Expand All @@ -136,27 +141,48 @@ public:
### **Go**

```go
const mod = 1337

func superPow(a int, b []int) int {
const mod int = 1337
ans := 1
qpow := func(a, n int) int {
ans := 1
for ; n > 0; n >>= 1 {
if n&1 == 1 {
ans = ans * a % mod
}
a = a * a % mod
}
return ans
}
for i := len(b) - 1; i >= 0; i-- {
ans = ans * quickPowAndMod(a, b[i]) % mod
a = quickPowAndMod(a, 10)
ans = ans * qpow(a, b[i]) % mod
a = qpow(a, 10)
}
return ans
}
```

func quickPowAndMod(a, b int) int {
ans := 1
for b > 0 {
if b&1 > 0 {
ans = ans * a % mod
}
b >>= 1
a = ((a % mod) * (a % mod)) % mod
}
return ans
### **TypeScript**

```ts
function superPow(a: number, b: number[]): number {
let ans = 1;
const mod = 1337;
const qpow = (a: number, n: number): number => {
let ans = 1;
for (; n; n >>= 1) {
if (n & 1) {
ans = Number((BigInt(ans) * BigInt(a)) % BigInt(mod));
}
a = Number((BigInt(a) * BigInt(a)) % BigInt(mod));
}
return ans;
};
for (let i = b.length - 1; ~i; --i) {
ans = Number((BigInt(ans) * BigInt(qpow(a, b[i]))) % BigInt(mod));
a = qpow(a, 10);
}
return ans;
}
```

Expand Down
110 changes: 64 additions & 46 deletions solution/0300-0399/0372.Super Pow/README_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,37 +47,36 @@
```python
class Solution:
def superPow(self, a: int, b: List[int]) -> int:
MOD = 1337
mod = 1337
ans = 1
for e in b[::-1]:
ans = ans * pow(a, e, MOD) % MOD
a = pow(a, 10, MOD)
ans = ans * pow(a, e, mod) % mod
a = pow(a, 10, mod)
return ans
```

### **Java**

```java
class Solution {
private static final int MOD = 1337;
private final int mod = 1337;

public int superPow(int a, int[] b) {
int ans = 1;
long ans = 1;
for (int i = b.length - 1; i >= 0; --i) {
ans = (int) ((long) ans * quickPowAndMod(a, b[i]) % MOD);
a = quickPowAndMod(a, 10);
ans = ans * qpow(a, b[i]) % mod;
a = qpow(a, 10);
}
return ans;
return (int) ans;
}

private int quickPowAndMod(int a, int b) {
int ans = 1;
while (b > 0) {
if ((b & 1) == 1) {
ans = (ans * (a % MOD)) % MOD;
private long qpow(long a, int n) {
long ans = 1;
for (; n > 0; n >>= 1) {
if ((n & 1) == 1) {
ans = ans * a % mod;
}
b >>= 1;
a = (a % MOD) * (a % MOD) % MOD;
a = a * a % mod;
}
return ans;
}
Expand All @@ -88,26 +87,24 @@ class Solution {

```cpp
class Solution {
const int MOD = 1337;

public:
int superPow(int a, vector<int>& b) {
int ans = 1;
for (int i = b.size() - 1; i >= 0; --i) {
ans = (long) ans * quickPowAndMod(a, b[i]) % MOD;
a = quickPowAndMod(a, 10);
}
return ans;
}

int quickPowAndMod(int a, int b) {
int ans = 1;
while (b) {
if (b & 1) {
ans = (ans * (a % MOD)) % MOD;
using ll = long long;
const int mod = 1337;
ll ans = 1;
auto qpow = [&](ll a, int n) {
ll ans = 1;
for (; n; n >>= 1) {
if (n & 1) {
ans = ans * a % mod;
}
a = a * a % mod;
}
b >>= 1;
a = ((a % MOD) * (a % MOD)) % MOD;
return (int) ans;
};
for (int i = b.size() - 1; ~i; --i) {
ans = ans * qpow(a, b[i]) % mod;
a = qpow(a, 10);
}
return ans;
}
Expand All @@ -117,27 +114,48 @@ public:
### **Go**

```go
const mod = 1337

func superPow(a int, b []int) int {
const mod int = 1337
ans := 1
qpow := func(a, n int) int {
ans := 1
for ; n > 0; n >>= 1 {
if n&1 == 1 {
ans = ans * a % mod
}
a = a * a % mod
}
return ans
}
for i := len(b) - 1; i >= 0; i-- {
ans = ans * quickPowAndMod(a, b[i]) % mod
a = quickPowAndMod(a, 10)
ans = ans * qpow(a, b[i]) % mod
a = qpow(a, 10)
}
return ans
}
```

func quickPowAndMod(a, b int) int {
ans := 1
for b > 0 {
if b&1 > 0 {
ans = ans * a % mod
}
b >>= 1
a = ((a % mod) * (a % mod)) % mod
}
return ans
### **TypeScript**

```ts
function superPow(a: number, b: number[]): number {
let ans = 1;
const mod = 1337;
const qpow = (a: number, n: number): number => {
let ans = 1;
for (; n; n >>= 1) {
if (n & 1) {
ans = Number((BigInt(ans) * BigInt(a)) % BigInt(mod));
}
a = Number((BigInt(a) * BigInt(a)) % BigInt(mod));
}
return ans;
};
for (let i = b.length - 1; ~i; --i) {
ans = Number((BigInt(ans) * BigInt(qpow(a, b[i]))) % BigInt(mod));
a = qpow(a, 10);
}
return ans;
}
```

Expand Down
46 changes: 22 additions & 24 deletions solution/0300-0399/0372.Super Pow/Solution.cpp
Original file line number Diff line number Diff line change
@@ -1,25 +1,23 @@
class Solution {
const int MOD = 1337;

public:
int superPow(int a, vector<int>& b) {
int ans = 1;
for (int i = b.size() - 1; i >= 0; --i) {
ans = (long) ans * quickPowAndMod(a, b[i]) % MOD;
a = quickPowAndMod(a, 10);
}
return ans;
}

int quickPowAndMod(int a, int b) {
int ans = 1;
while (b) {
if (b & 1) {
ans = (ans * (a % MOD)) % MOD;
}
b >>= 1;
a = ((a % MOD) * (a % MOD)) % MOD;
}
return ans;
}
class Solution {
public:
int superPow(int a, vector<int>& b) {
using ll = long long;
const int mod = 1337;
ll ans = 1;
auto qpow = [&](ll a, int n) {
ll ans = 1;
for (; n; n >>= 1) {
if (n & 1) {
ans = ans * a % mod;
}
a = a * a % mod;
}
return (int) ans;
};
for (int i = b.size() - 1; ~i; --i) {
ans = ans * qpow(a, b[i]) % mod;
a = qpow(a, 10);
}
return ans;
}
};
Loading