1
1
class Solution {
2
2
public:
3
- int m, n;
4
- const int mod = 1e9 + 7 ;
5
- vector<vector<int >> f;
6
- vector<vector<int >> c;
7
-
8
3
int idealArrays (int n, int maxValue) {
9
- this ->m = maxValue;
10
- this ->n = n;
11
- f.assign (maxValue + 1 , vector<int >(16 , -1 ));
12
- c.assign (n, vector<int >(16 , 0 ));
13
- for (int i = 0 ; i < n; ++i)
14
- for (int j = 0 ; j <= i && j < 16 ; ++j)
15
- c[i][j] = !j ? 1 : (c[i - 1 ][j] + c[i - 1 ][j - 1 ]) % mod;
16
- int ans = 0 ;
17
- for (int i = 1 ; i <= m; ++i) ans = (ans + dfs (i, 1 )) % mod;
18
- return ans;
19
- }
4
+ const int mod = 1e9 + 7 ;
5
+ vector<vector<int >> c (n, vector<int >(16 ));
6
+ for (int i = 0 ; i < n; ++i) {
7
+ for (int j = 0 ; j <= i && j < 16 ; ++j) {
8
+ if (j == 0 ) {
9
+ c[i][j] = 1 ;
10
+ } else {
11
+ c[i][j] = (c[i - 1 ][j] + c[i - 1 ][j - 1 ]) % mod;
12
+ }
13
+ }
14
+ }
15
+
16
+ vector<vector<long long >> f (maxValue + 1 , vector<long long >(16 ));
17
+ for (int i = 1 ; i <= maxValue; ++i) {
18
+ f[i][1 ] = 1 ;
19
+ }
20
20
21
- int dfs (int i, int cnt) {
22
- if (f[i][cnt] != -1 ) return f[i][cnt];
23
- int res = c[n - 1 ][cnt - 1 ];
24
- if (cnt < n)
25
- for (int k = 2 ; k * i <= m; ++k)
26
- res = (res + dfs (k * i, cnt + 1 )) % mod;
27
- f[i][cnt] = res;
28
- return res;
21
+ for (int j = 1 ; j < 15 ; ++j) {
22
+ for (int i = 1 ; i <= maxValue; ++i) {
23
+ for (int k = 2 ; k * i <= maxValue; ++k) {
24
+ f[k * i][j + 1 ] = (f[k * i][j + 1 ] + f[i][j]) % mod;
25
+ }
26
+ }
27
+ }
28
+
29
+ long long ans = 0 ;
30
+ for (int i = 1 ; i <= maxValue; ++i) {
31
+ for (int j = 1 ; j < 16 ; ++j) {
32
+ ans = (ans + f[i][j] * c[n - 1 ][j - 1 ]) % mod;
33
+ }
34
+ }
35
+
36
+ return ans;
29
37
}
30
- };
38
+ };
0 commit comments