Skip to content

Commit 1ab2686

Browse files
authoredFeb 6, 2024
feat: add solutions to lc problem: No.2902 (#2320)
1 parent 1d97527 commit 1ab2686

File tree

5 files changed

+273
-0
lines changed

5 files changed

+273
-0
lines changed
 

‎solution/2900-2999/2902.Count of Sub-Multisets With Bounded Sum/README.md

+94
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,100 @@ class Solution {
135135
}
136136
```
137137

138+
```cpp
139+
class Solution {
140+
public:
141+
int countSubMultisets(const vector<int> &nums, int l, int r) {
142+
int cnt[20001] = {};
143+
int memo[20001] = {};
144+
const int mod = 1000000007;
145+
for (int n : nums) {
146+
++cnt[n];
147+
}
148+
fill_n(memo, cnt[1] + 1, 1);
149+
for (int n = 2, total = cnt[1]; n <= r; ++n) {
150+
if (!cnt[n]) {
151+
continue;
152+
}
153+
int top = (cnt[n] + 1) * n;
154+
total += n * cnt[n];
155+
for (int i = n, ii = min(total, r); i <= ii; ++i) {
156+
memo[i] = (memo[i] + memo[i - n]) % mod;
157+
}
158+
for (int i = min(total, r); i >= top; --i) {
159+
memo[i] = (mod + memo[i] - memo[i - top]) % mod;
160+
}
161+
}
162+
return accumulate(memo + l, memo + r + 1, 0LL) * (cnt[0] + 1) % mod;
163+
}
164+
};
165+
```
166+
167+
```go
168+
func countSubMultisets(nums []int, l int, r int) int {
169+
multiset := make(map[int]int)
170+
for _, num := range nums {
171+
multiset[num]++
172+
}
173+
mem := make([]int, r+1)
174+
mem[0] = 1
175+
prefix := make([]int, len(mem))
176+
for num, occ := range multiset {
177+
copy(prefix, mem)
178+
for sum := num; sum <= r; sum++ {
179+
prefix[sum] = (prefix[sum] + prefix[sum-num]) % mod
180+
}
181+
for sum := r; sum >= 0; sum-- {
182+
if num > 0 {
183+
mem[sum] = prefix[sum]
184+
if sum >= num*(occ+1) {
185+
mem[sum] = (mem[sum] - prefix[sum-num*(occ+1)] + mod) % mod
186+
}
187+
} else {
188+
mem[sum] = (mem[sum] * (occ + 1)) % mod
189+
}
190+
}
191+
}
192+
var result int
193+
for sum := l; sum <= r; sum++ {
194+
result = (result + mem[sum]) % mod
195+
}
196+
return result
197+
}
198+
var mod int = 1e9 + 7
199+
```
200+
201+
```ts
202+
function countSubMultisets(nums: number[], l: number, r: number): number {
203+
const cnt: number[] = Array(20001).fill(0);
204+
const memo: number[] = Array(20001).fill(0);
205+
const mod: number = 1000000007;
206+
for (const n of nums) {
207+
cnt[n]++;
208+
}
209+
memo.fill(1, 0, cnt[1] + 1);
210+
let total: number = cnt[1];
211+
for (let n = 2; n <= r; ++n) {
212+
if (!cnt[n]) {
213+
continue;
214+
}
215+
const top: number = (cnt[n] + 1) * n;
216+
total += n * cnt[n];
217+
for (let i = n, ii = Math.min(total, r); i <= ii; ++i) {
218+
memo[i] = (memo[i] + memo[i - n]) % mod;
219+
}
220+
for (let i = Math.min(total, r); i >= top; --i) {
221+
memo[i] = (mod + memo[i] - memo[i - top]) % mod;
222+
}
223+
}
224+
let result: number = 0;
225+
for (let i = l; i <= r; i++) {
226+
result = (result + memo[i]) % mod;
227+
}
228+
return (result * (cnt[0] + 1)) % mod;
229+
}
230+
```
231+
138232
<!-- tabs:end -->
139233

140234
<!-- end -->

‎solution/2900-2999/2902.Count of Sub-Multisets With Bounded Sum/README_EN.md

+94
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,100 @@ class Solution {
131131
}
132132
```
133133

134+
```cpp
135+
class Solution {
136+
public:
137+
int countSubMultisets(const vector<int> &nums, int l, int r) {
138+
int cnt[20001] = {};
139+
int memo[20001] = {};
140+
const int mod = 1000000007;
141+
for (int n : nums) {
142+
++cnt[n];
143+
}
144+
fill_n(memo, cnt[1] + 1, 1);
145+
for (int n = 2, total = cnt[1]; n <= r; ++n) {
146+
if (!cnt[n]) {
147+
continue;
148+
}
149+
int top = (cnt[n] + 1) * n;
150+
total += n * cnt[n];
151+
for (int i = n, ii = min(total, r); i <= ii; ++i) {
152+
memo[i] = (memo[i] + memo[i - n]) % mod;
153+
}
154+
for (int i = min(total, r); i >= top; --i) {
155+
memo[i] = (mod + memo[i] - memo[i - top]) % mod;
156+
}
157+
}
158+
return accumulate(memo + l, memo + r + 1, 0LL) * (cnt[0] + 1) % mod;
159+
}
160+
};
161+
```
162+
163+
```go
164+
func countSubMultisets(nums []int, l int, r int) int {
165+
multiset := make(map[int]int)
166+
for _, num := range nums {
167+
multiset[num]++
168+
}
169+
mem := make([]int, r+1)
170+
mem[0] = 1
171+
prefix := make([]int, len(mem))
172+
for num, occ := range multiset {
173+
copy(prefix, mem)
174+
for sum := num; sum <= r; sum++ {
175+
prefix[sum] = (prefix[sum] + prefix[sum-num]) % mod
176+
}
177+
for sum := r; sum >= 0; sum-- {
178+
if num > 0 {
179+
mem[sum] = prefix[sum]
180+
if sum >= num*(occ+1) {
181+
mem[sum] = (mem[sum] - prefix[sum-num*(occ+1)] + mod) % mod
182+
}
183+
} else {
184+
mem[sum] = (mem[sum] * (occ + 1)) % mod
185+
}
186+
}
187+
}
188+
var result int
189+
for sum := l; sum <= r; sum++ {
190+
result = (result + mem[sum]) % mod
191+
}
192+
return result
193+
}
194+
var mod int = 1e9 + 7
195+
```
196+
197+
```ts
198+
function countSubMultisets(nums: number[], l: number, r: number): number {
199+
const cnt: number[] = Array(20001).fill(0);
200+
const memo: number[] = Array(20001).fill(0);
201+
const mod: number = 1000000007;
202+
for (const n of nums) {
203+
cnt[n]++;
204+
}
205+
memo.fill(1, 0, cnt[1] + 1);
206+
let total: number = cnt[1];
207+
for (let n = 2; n <= r; ++n) {
208+
if (!cnt[n]) {
209+
continue;
210+
}
211+
const top: number = (cnt[n] + 1) * n;
212+
total += n * cnt[n];
213+
for (let i = n, ii = Math.min(total, r); i <= ii; ++i) {
214+
memo[i] = (memo[i] + memo[i - n]) % mod;
215+
}
216+
for (let i = Math.min(total, r); i >= top; --i) {
217+
memo[i] = (mod + memo[i] - memo[i - top]) % mod;
218+
}
219+
}
220+
let result: number = 0;
221+
for (let i = l; i <= r; i++) {
222+
result = (result + memo[i]) % mod;
223+
}
224+
return (result * (cnt[0] + 1)) % mod;
225+
}
226+
```
227+
134228
<!-- tabs:end -->
135229

136230
<!-- end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution {
2+
public:
3+
int countSubMultisets(const vector<int>& nums, int l, int r) {
4+
int cnt[20001] = {};
5+
int memo[20001] = {};
6+
const int mod = 1000000007;
7+
for (int n : nums) {
8+
++cnt[n];
9+
}
10+
fill_n(memo, cnt[1] + 1, 1);
11+
for (int n = 2, total = cnt[1]; n <= r; ++n) {
12+
if (!cnt[n]) {
13+
continue;
14+
}
15+
int top = (cnt[n] + 1) * n;
16+
total += n * cnt[n];
17+
for (int i = n, ii = min(total, r); i <= ii; ++i) {
18+
memo[i] = (memo[i] + memo[i - n]) % mod;
19+
}
20+
for (int i = min(total, r); i >= top; --i) {
21+
memo[i] = (mod + memo[i] - memo[i - top]) % mod;
22+
}
23+
}
24+
return accumulate(memo + l, memo + r + 1, 0LL) * (cnt[0] + 1) % mod;
25+
}
26+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
func countSubMultisets(nums []int, l int, r int) int {
2+
multiset := make(map[int]int)
3+
for _, num := range nums {
4+
multiset[num]++
5+
}
6+
mem := make([]int, r+1)
7+
mem[0] = 1
8+
prefix := make([]int, len(mem))
9+
for num, occ := range multiset {
10+
copy(prefix, mem)
11+
for sum := num; sum <= r; sum++ {
12+
prefix[sum] = (prefix[sum] + prefix[sum-num]) % mod
13+
}
14+
for sum := r; sum >= 0; sum-- {
15+
if num > 0 {
16+
mem[sum] = prefix[sum]
17+
if sum >= num*(occ+1) {
18+
mem[sum] = (mem[sum] - prefix[sum-num*(occ+1)] + mod) % mod
19+
}
20+
} else {
21+
mem[sum] = (mem[sum] * (occ + 1)) % mod
22+
}
23+
}
24+
}
25+
var result int
26+
for sum := l; sum <= r; sum++ {
27+
result = (result + mem[sum]) % mod
28+
}
29+
return result
30+
}
31+
var mod int = 1e9 + 7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
function countSubMultisets(nums: number[], l: number, r: number): number {
2+
const cnt: number[] = Array(20001).fill(0);
3+
const memo: number[] = Array(20001).fill(0);
4+
const mod: number = 1000000007;
5+
for (const n of nums) {
6+
cnt[n]++;
7+
}
8+
memo.fill(1, 0, cnt[1] + 1);
9+
let total: number = cnt[1];
10+
for (let n = 2; n <= r; ++n) {
11+
if (!cnt[n]) {
12+
continue;
13+
}
14+
const top: number = (cnt[n] + 1) * n;
15+
total += n * cnt[n];
16+
for (let i = n, ii = Math.min(total, r); i <= ii; ++i) {
17+
memo[i] = (memo[i] + memo[i - n]) % mod;
18+
}
19+
for (let i = Math.min(total, r); i >= top; --i) {
20+
memo[i] = (mod + memo[i] - memo[i - top]) % mod;
21+
}
22+
}
23+
let result: number = 0;
24+
for (let i = l; i <= r; i++) {
25+
result = (result + memo[i]) % mod;
26+
}
27+
return (result * (cnt[0] + 1)) % mod;
28+
}

0 commit comments

Comments
 (0)