Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 1ab2686

Browse files
feat: add solutions to lc problem: No.2902 (doocs#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‎

Lines changed: 94 additions & 0 deletions
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‎

Lines changed: 94 additions & 0 deletions
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 -->
Lines changed: 26 additions & 0 deletions
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+
};
Lines changed: 31 additions & 0 deletions
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
Lines changed: 28 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /