11class Solution {
22public:
3- int m, n;
4- const int mod = 1e9 + 7 ;
5- vector<vector<int >> f;
6- vector<vector<int >> c;
7-
83 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+ }
2020
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;
2937 }
30- };
38+ };
0 commit comments