Skip to content

Commit 4146655

Browse files
authored
feat: add solutions to lc problem: No.1969 (doocs#1269)
No.1969.Minimum Non-Zero Product of the Array Elements
1 parent d3634e3 commit 4146655

File tree

6 files changed

+217
-2
lines changed

6 files changed

+217
-2
lines changed

solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/README.md

+82-1
Original file line numberDiff line numberDiff line change
@@ -65,22 +65,103 @@
6565

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

68+
**方法一:贪心 + 快速幂**
69+
70+
我们注意到,每一次操作,并不会改变元素的和,而在元素和不变的情况下,要想使得乘积最小,应该尽可能最大化元素的差值。
71+
72+
由于最大的元素为 $2^p - 1$,无论与哪个元素交换,都不会使得差值变大,因此我们不需要考虑与最大元素交换的情况。
73+
74+
对于其它的 $[1,..2^p-2]$ 的元素,我们依次将首尾元素两两配对,即 $x$ 与 $2^p-1-x$ 进行配置,那么经过若干次操作过后,每一对元素都变成了 $(1, 2^p-2)$,那么最终的乘积为 $(2^p-1) \times (2^p-2)^{2^{p-1}-1}$。
75+
76+
时间复杂度 $O(p)$,空间复杂度 $O(1)$。
77+
6878
<!-- tabs:start -->
6979

7080
### **Python3**
7181

7282
<!-- 这里可写当前语言的特殊实现逻辑 -->
7383

7484
```python
75-
85+
class Solution:
86+
def minNonZeroProduct(self, p: int) -> int:
87+
mod = 10**9 + 7
88+
return (2**p - 1) * pow(2**p - 2, 2 ** (p - 1) - 1, mod) % mod
7689
```
7790

7891
### **Java**
7992

8093
<!-- 这里可写当前语言的特殊实现逻辑 -->
8194

8295
```java
96+
class Solution {
97+
public int minNonZeroProduct(int p) {
98+
final int mod = (int) 1e9 + 7;
99+
long a = ((1L << p) - 1) % mod;
100+
long b = qmi(((1L << p) - 2) % mod, (1L << (p - 1)) - 1, mod);
101+
return (int) (a * b % mod);
102+
}
103+
104+
long qmi(long a, long k, long p) {
105+
long res = 1;
106+
while (k != 0) {
107+
if ((k & 1) == 1) {
108+
res = res * a % p;
109+
}
110+
k >>= 1;
111+
a = a * a % p;
112+
}
113+
return res;
114+
}
115+
}
116+
```
117+
118+
### **C++**
119+
120+
```cpp
121+
class Solution {
122+
public:
123+
int minNonZeroProduct(int p) {
124+
const int mod = 1e9 + 7;
125+
long long a = ((1LL << p) - 1) % mod;
126+
long long b = qmi(((1LL << p) - 2) % mod, (1L << (p - 1)) - 1, mod);
127+
return a * b % mod;
128+
}
129+
130+
long long qmi(long long a, long long k, int p) {
131+
long long res = 1;
132+
while (k != 0) {
133+
if ((k & 1) == 1) {
134+
res = res * a % p;
135+
}
136+
k >>= 1;
137+
a = a * a % p;
138+
}
139+
return res;
140+
}
141+
};
142+
```
83143

144+
### **Go**
145+
146+
```go
147+
func minNonZeroProduct(p int) int {
148+
const mod int = 1e9 + 7
149+
a := ((1 << p) - 1) % mod
150+
b := qmi(((1<<p)-2)%mod, (1<<(p-1))-1, mod)
151+
return a * b % mod
152+
}
153+
154+
func qmi(a, k, p int) int {
155+
res := 1
156+
for k != 0 {
157+
if k&1 == 1 {
158+
res = res * a % p
159+
}
160+
k >>= 1
161+
a = a * a % p
162+
}
163+
return res
164+
}
84165
```
85166

86167
### **...**

solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/README_EN.md

+72-1
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,84 @@ The array product is 1 * 6 * 1 * 6 * 1 * 6 * 7 = 1512, which is the minimum poss
6464
### **Python3**
6565

6666
```python
67-
67+
class Solution:
68+
def minNonZeroProduct(self, p: int) -> int:
69+
mod = 10**9 + 7
70+
return (2**p - 1) * pow(2**p - 2, 2 ** (p - 1) - 1, mod) % mod
6871
```
6972

7073
### **Java**
7174

7275
```java
76+
class Solution {
77+
public int minNonZeroProduct(int p) {
78+
final int mod = (int) 1e9 + 7;
79+
long a = ((1L << p) - 1) % mod;
80+
long b = qmi(((1L << p) - 2) % mod, (1L << (p - 1)) - 1, mod);
81+
return (int) (a * b % mod);
82+
}
83+
84+
long qmi(long a, long k, long p) {
85+
long res = 1;
86+
while (k != 0) {
87+
if ((k & 1) == 1) {
88+
res = res * a % p;
89+
}
90+
k >>= 1;
91+
a = a * a % p;
92+
}
93+
return res;
94+
}
95+
}
96+
```
97+
98+
### **C++**
99+
100+
```cpp
101+
class Solution {
102+
public:
103+
int minNonZeroProduct(int p) {
104+
const int mod = 1e9 + 7;
105+
long long a = ((1LL << p) - 1) % mod;
106+
long long b = qmi(((1LL << p) - 2) % mod, (1L << (p - 1)) - 1, mod);
107+
return a * b % mod;
108+
}
109+
110+
long long qmi(long long a, long long k, int p) {
111+
long long res = 1;
112+
while (k != 0) {
113+
if ((k & 1) == 1) {
114+
res = res * a % p;
115+
}
116+
k >>= 1;
117+
a = a * a % p;
118+
}
119+
return res;
120+
}
121+
};
122+
```
73123

124+
### **Go**
125+
126+
```go
127+
func minNonZeroProduct(p int) int {
128+
const mod int = 1e9 + 7
129+
a := ((1 << p) - 1) % mod
130+
b := qmi(((1<<p)-2)%mod, (1<<(p-1))-1, mod)
131+
return a * b % mod
132+
}
133+
134+
func qmi(a, k, p int) int {
135+
res := 1
136+
for k != 0 {
137+
if k&1 == 1 {
138+
res = res * a % p
139+
}
140+
k >>= 1
141+
a = a * a % p
142+
}
143+
return res
144+
}
74145
```
75146

76147
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public:
3+
int minNonZeroProduct(int p) {
4+
const int mod = 1e9 + 7;
5+
long long a = ((1LL << p) - 1) % mod;
6+
long long b = qmi(((1LL << p) - 2) % mod, (1L << (p - 1)) - 1, mod);
7+
return a * b % mod;
8+
}
9+
10+
long long qmi(long long a, long long k, int p) {
11+
long long res = 1;
12+
while (k != 0) {
13+
if ((k & 1) == 1) {
14+
res = res * a % p;
15+
}
16+
k >>= 1;
17+
a = a * a % p;
18+
}
19+
return res;
20+
}
21+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
func minNonZeroProduct(p int) int {
2+
const mod int = 1e9 + 7
3+
a := ((1 << p) - 1) % mod
4+
b := qmi(((1<<p)-2)%mod, (1<<(p-1))-1, mod)
5+
return a * b % mod
6+
}
7+
8+
func qmi(a, k, p int) int {
9+
res := 1
10+
for k != 0 {
11+
if k&1 == 1 {
12+
res = res * a % p
13+
}
14+
k >>= 1
15+
a = a * a % p
16+
}
17+
return res
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public int minNonZeroProduct(int p) {
3+
final int mod = (int) 1e9 + 7;
4+
long a = ((1L << p) - 1) % mod;
5+
long b = qmi(((1L << p) - 2) % mod, (1L << (p - 1)) - 1, mod);
6+
return (int) (a * b % mod);
7+
}
8+
9+
long qmi(long a, long k, long p) {
10+
long res = 1;
11+
while (k != 0) {
12+
if ((k & 1) == 1) {
13+
res = res * a % p;
14+
}
15+
k >>= 1;
16+
a = a * a % p;
17+
}
18+
return res;
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
class Solution:
2+
def minNonZeroProduct(self, p: int) -> int:
3+
mod = 10**9 + 7
4+
return (2**p - 1) * pow(2**p - 2, 2 ** (p - 1) - 1, mod) % mod

0 commit comments

Comments
 (0)