|
49 | 49 | <li><code>b</code> 不含前导 0</li>
|
50 | 50 | </ul>
|
51 | 51 |
|
52 |
| - |
53 | 52 | ## 解法
|
54 | 53 |
|
55 | 54 | <!-- 这里可写通用的实现逻辑 -->
|
56 | 55 |
|
| 56 | +乘方快速幂。 |
| 57 | + |
57 | 58 | <!-- tabs:start -->
|
58 | 59 |
|
59 | 60 | ### **Python3**
|
60 | 61 |
|
61 | 62 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
62 | 63 |
|
63 | 64 | ```python
|
64 |
| - |
| 65 | +class Solution: |
| 66 | + def superPow(self, a: int, b: List[int]) -> int: |
| 67 | + MOD = 1337 |
| 68 | + ans = 1 |
| 69 | + for e in b[::-1]: |
| 70 | + ans = ans * pow(a, e, MOD) % MOD |
| 71 | + a = pow(a, 10, MOD) |
| 72 | + return ans |
65 | 73 | ```
|
66 | 74 |
|
67 | 75 | ### **Java**
|
68 | 76 |
|
69 | 77 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
70 | 78 |
|
71 | 79 | ```java
|
| 80 | +class Solution { |
| 81 | + private static final int MOD = 1337; |
| 82 | + |
| 83 | + public int superPow(int a, int[] b) { |
| 84 | + int ans = 1; |
| 85 | + for (int i = b.length - 1; i >= 0; --i) { |
| 86 | + ans = (int) ((long) ans * quickPowAndMod(a, b[i]) % MOD); |
| 87 | + a = quickPowAndMod(a, 10); |
| 88 | + } |
| 89 | + return ans; |
| 90 | + } |
| 91 | + |
| 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; |
| 97 | + } |
| 98 | + b >>= 1; |
| 99 | + a = (a % MOD) * (a % MOD) % MOD; |
| 100 | + } |
| 101 | + return ans; |
| 102 | + } |
| 103 | +} |
| 104 | +``` |
| 105 | + |
| 106 | +### **C++** |
| 107 | + |
| 108 | +```cpp |
| 109 | +class Solution { |
| 110 | + const int MOD = 1337; |
| 111 | +public: |
| 112 | + int superPow(int a, vector<int>& b) { |
| 113 | + int ans = 1; |
| 114 | + for (int i = b.size() - 1; i >= 0; --i) |
| 115 | + { |
| 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 | + { |
| 126 | + if (b & 1) |
| 127 | + { |
| 128 | + ans = (ans * (a % MOD)) % MOD; |
| 129 | + } |
| 130 | + b >>= 1; |
| 131 | + a = ((a % MOD) * (a % MOD)) % MOD; |
| 132 | + } |
| 133 | + return ans; |
| 134 | + } |
| 135 | +}; |
| 136 | +``` |
72 | 137 |
|
| 138 | +### **Go** |
| 139 | + |
| 140 | +```go |
| 141 | +const mod = 1337 |
| 142 | + |
| 143 | +func superPow(a int, b []int) int { |
| 144 | + ans := 1 |
| 145 | + for i := len(b) - 1; i >= 0; i-- { |
| 146 | + ans = ans * quickPowAndMod(a, b[i]) % mod |
| 147 | + a = quickPowAndMod(a, 10) |
| 148 | + } |
| 149 | + return ans |
| 150 | +} |
| 151 | + |
| 152 | +func quickPowAndMod(a, b int) int { |
| 153 | + ans := 1 |
| 154 | + for b > 0 { |
| 155 | + if b&1 > 0 { |
| 156 | + ans = ans * a % mod |
| 157 | + } |
| 158 | + b >>= 1 |
| 159 | + a = ((a % mod) * (a % mod)) % mod |
| 160 | + } |
| 161 | + return ans |
| 162 | +} |
73 | 163 | ```
|
74 | 164 |
|
75 | 165 | ### **...**
|
|
0 commit comments