File tree Expand file tree Collapse file tree 3 files changed +63
-0
lines changed
solution/2900-2999/2902.Count of Sub-Multisets With Bounded Sum Expand file tree Collapse file tree 3 files changed +63
-0
lines changed Original file line number Diff line number Diff line change 68
68
<!-- 这里可写当前语言的特殊实现逻辑 -->
69
69
70
70
``` python
71
+ class Solution :
72
+ def countSubMultisets (self , nums : List[int ], l : int , r : int ) -> int :
73
+ kMod = 1_000_000_007
74
+ # dp[i] := # of submultisets of nums with sum i
75
+ dp = [1 ] + [0 ] * r
76
+ count = collections.Counter(nums)
77
+ zeros = count.pop(0 , 0 )
78
+
79
+ for num, freq in count.items():
80
+ # stride[i] := dp[i] + dp[i - num] + dp[i - 2 * num] + ...
81
+ stride = dp.copy()
82
+ for i in range (num, r + 1 ):
83
+ stride[i] += stride[i - num]
84
+ for i in range (r, 0 , - 1 ):
85
+ if i >= num * (freq + 1 ):
86
+ # dp[i] + dp[i - num] + dp[i - freq * num]
87
+ dp[i] = stride[i] - stride[i - num * (freq + 1 )]
88
+ else :
89
+ dp[i] = stride[i]
90
+
91
+ return (zeros + 1 ) * sum (dp[l : r + 1 ]) % kMod
71
92
72
93
```
73
94
Original file line number Diff line number Diff line change 60
60
### ** Python3**
61
61
62
62
``` python
63
+ class Solution :
64
+ def countSubMultisets (self , nums : List[int ], l : int , r : int ) -> int :
65
+ kMod = 1_000_000_007
66
+ # dp[i] := # of submultisets of nums with sum i
67
+ dp = [1 ] + [0 ] * r
68
+ count = collections.Counter(nums)
69
+ zeros = count.pop(0 , 0 )
70
+
71
+ for num, freq in count.items():
72
+ # stride[i] := dp[i] + dp[i - num] + dp[i - 2 * num] + ...
73
+ stride = dp.copy()
74
+ for i in range (num, r + 1 ):
75
+ stride[i] += stride[i - num]
76
+ for i in range (r, 0 , - 1 ):
77
+ if i >= num * (freq + 1 ):
78
+ # dp[i] + dp[i - num] + dp[i - freq * num]
79
+ dp[i] = stride[i] - stride[i - num * (freq + 1 )]
80
+ else :
81
+ dp[i] = stride[i]
82
+
83
+ return (zeros + 1 ) * sum (dp[l : r + 1 ]) % kMod
63
84
64
85
```
65
86
Original file line number Diff line number Diff line change
1
+ class Solution :
2
+ def countSubMultisets (self , nums : List [int ], l : int , r : int ) -> int :
3
+ kMod = 1_000_000_007
4
+ # dp[i] := # of submultisets of nums with sum i
5
+ dp = [1 ] + [0 ] * r
6
+ count = collections .Counter (nums )
7
+ zeros = count .pop (0 , 0 )
8
+
9
+ for num , freq in count .items ():
10
+ # stride[i] := dp[i] + dp[i - num] + dp[i - 2 * num] + ...
11
+ stride = dp .copy ()
12
+ for i in range (num , r + 1 ):
13
+ stride [i ] += stride [i - num ]
14
+ for i in range (r , 0 , - 1 ):
15
+ if i >= num * (freq + 1 ):
16
+ # dp[i] + dp[i - num] + dp[i - freq * num]
17
+ dp [i ] = stride [i ] - stride [i - num * (freq + 1 )]
18
+ else :
19
+ dp [i ] = stride [i ]
20
+
21
+ return (zeros + 1 ) * sum (dp [l : r + 1 ]) % kMod
You can’t perform that action at this time.
0 commit comments