1
+ /* *
2
+ * @file 2093.cpp
3
+ * @author Macesuted ([email protected] )
4
+ * @date 2022-06-01
5
+ *
6
+ * @copyright Copyright (c) 2022
7
+ *
8
+ */
9
+
10
+ #include < bits/stdc++.h>
11
+ using namespace std ;
12
+
13
+ bool mem1;
14
+
15
+ #define maxn 405
16
+ #define mod 1000000007
17
+
18
+ int a[maxn];
19
+ int64_t f[2 ][maxn][maxn], g[maxn][maxn], h[maxn][maxn];
20
+
21
+ int64_t Pow (int64_t a, int64_t x) {
22
+ int64_t ans = 1 ;
23
+ while (x) {
24
+ if (x & 1 ) ans = ans * a % mod;
25
+ a = a * a % mod, x >>= 1 ;
26
+ }
27
+ return ans;
28
+ }
29
+
30
+ void solve (void ) {
31
+ int n, m;
32
+ cin >> n >> m;
33
+ for (int i = 1 ; i <= n; i++) cin >> a[i];
34
+ a[0 ] = a[n + 1 ] = 0x3f3f3f3f ;
35
+ for (int i = 1 ; i <= n; i++)
36
+ for (int j = i, maxVal = a[i]; j <= n; maxVal = max (maxVal, a[++j]))
37
+ if (i != 1 || j != n) f[0 ][i][j] = (f[0 ][i][j] + max (0 , min (a[i - 1 ], a[j + 1 ]) - maxVal)) % mod;
38
+ auto F = [&](int l, int r) { return (l - 1 ) * l / 2 + (r - l + 1 ) * (r - l + 2 ) / 2 + (n - r) * (n - r + 1 ) / 2 ; };
39
+ for (int k = 1 ; k <= m; k++) {
40
+ bool t = k & 1 ;
41
+ for (int i = 1 ; i <= n; i++)
42
+ for (int j = i; j <= n; j++) g[i][j] = (g[i - 1 ][j] + f[!t][i][j] * (i - 1 )) % mod;
43
+ for (int i = 1 ; i <= n; i++)
44
+ for (int j = n; j >= i; j--) h[i][j] = (h[i][j + 1 ] + f[!t][i][j] * (n - j)) % mod;
45
+ for (int i = 1 ; i <= n; i++)
46
+ for (int j = i; j <= n; j++) f[t][i][j] = (f[!t][i][j] * F (i, j) + g[i - 1 ][j] + h[i][j + 1 ]) % mod;
47
+ }
48
+ int maxVal = 0 ;
49
+ for (int i = 1 ; i <= n; i++) maxVal = max (maxVal, a[i]);
50
+ int tot = maxVal * Pow (n * (n + 1 ) / 2 , m) % mod;
51
+ for (int i = 1 ; i <= n; i++) {
52
+ int64_t ans = tot;
53
+ for (int l = 1 ; l <= i; l++)
54
+ for (int r = i; r <= n; r++) ans = (ans + mod - f[m & 1 ][l][r]) % mod;
55
+ cout << ans << ' ' ;
56
+ }
57
+ cout << endl;
58
+ return ;
59
+ }
60
+
61
+ bool mem2;
62
+
63
+ int main () {
64
+ ios::sync_with_stdio (false ), cin.tie (nullptr );
65
+ #ifdef LOCAL
66
+ cerr << " Memory Cost: " << abs (&mem1 - &mem2) / 1024 . / 1024 . << " MB" << endl;
67
+ #endif
68
+
69
+ int _ = 1 ;
70
+ while (_--) solve ();
71
+
72
+ #ifdef LOCAL
73
+ cerr << " Time Cost: " << clock () * 1000 . / CLOCKS_PER_SEC << " MS" << endl;
74
+ #endif
75
+ return 0 ;
76
+ }
0 commit comments