1+ /* *
2+ * @file 14819.cpp
3+ * @author Macesuted ([email protected] ) 4+ * @date 2025-11-11
5+ *
6+ * @copyright Copyright (c) 2025
7+ *
8+ */
9+
10+ #include < bits/stdc++.h>
11+ using namespace std ;
12+
13+ #define endl ' \n '
14+
15+ #define maxn 1000005
16+ #define mod 1'000'000'007
17+
18+ int64_t f[maxn], g[maxn], h[maxn], a[maxn], mul[maxn], sum[maxn];
19+
20+ void solve (void ) {
21+ int n, x;
22+ cin >> n >> x;
23+ mul[0 ] = sum[0 ] = 1 ;
24+ for (int i = 1 ; i <= n; i++) cin >> a[i], sum[i] = (sum[i - 1 ] + (mul[i] = mul[i - 1 ] * a[i] % mod)) % mod;
25+
26+ auto add = [&](int64_t &x, int64_t y) -> int64_t { return x = (x + y) % mod; };
27+
28+ int64_t ans = mul[n];
29+ for (int i = 1 ; i <= n; i++) f[i] = g[i] = h[i] = 0 ;
30+ f[n + 1 ] = 1 , g[n + 1 ] = h[n + 1 ] = 0 ;
31+ for (int i = n + 1 ; i >= 1 ; i--) {
32+ if (i > 1 && a[i] > 1 ) add (h[i - 1 ], h[i]);
33+ if (i > 2 && a[i] == 1 ) add (h[i - 2 ], h[i]);
34+
35+ if (a[i] > 1 ) add (f[i], h[i]), add (g[i], h[i] * (a[i] - 2 ));
36+ if (i > 2 && a[i - 2 ] == a[i]) add (f[i - 2 ], h[i]);
37+ if (i > 1 ) add (f[i - 1 ], h[i]), add (g[i - 1 ], h[i] * (a[i - 1 ] - 1 ));
38+
39+ if (i > 1 ) add (f[i - 1 ], f[i]), add (g[i - 1 ], f[i] * (a[i - 1 ] - 1 ));
40+ if (i > 2 ) add (h[i - 2 ], f[i]);
41+
42+ if (i > 1 ) add (f[i - 1 ], g[i]), add (g[i - 1 ], g[i] * (a[i - 1 ] - 1 ));
43+ if (i > 1 ) add (h[i - 1 ], g[i]);
44+
45+ if (i > 2 ) add (ans, (sum[i - 3 ] + mul[i - 3 ] * (a[i - 2 ] - 1 )) % mod * f[i]);
46+ if (i > 1 ) add (ans, (sum[i - 2 ] + mul[i - 2 ] * (a[i - 1 ] - 1 )) % mod * g[i]);
47+ if (i > 1 && a[i] > 1 ) add (ans, (sum[i - 2 ] + mul[i - 2 ] * (a[i - 1 ] - 1 )) % mod * h[i]);
48+ if (i > 2 && a[i] == 1 ) add (ans, (sum[i - 3 ] + mul[i - 3 ] * (a[i - 2 ] - 1 )) % mod * h[i]);
49+ }
50+
51+ cout << ans << endl;
52+
53+ return ;
54+ }
55+
56+ int main () {
57+ ios::sync_with_stdio (false ), cin.tie (nullptr );
58+
59+ int _ = 1 ;
60+ cin >> _;
61+ while (_--) solve ();
62+
63+ return 0 ;
64+ }
0 commit comments