@@ -135,6 +135,100 @@ class Solution {
135
135
}
136
136
```
137
137
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
+
138
232
<!-- tabs: end -->
139
233
140
234
<!-- end -->
0 commit comments