1 struct Matrix {
2 int n , m ;
3 int mat[M][M] ;
4 int * operator [] (int x) {
5 return mat[x] ;
6 }
7 }
8
9 Matrix mul (Matrix x , Matrix y) {
10 Matrix res ;
11 memset (res.mat , 0 , sizeof(res.mat)) ;
12 res.n = x.n , res.m = y.m ;
13 for (int i = 0 ; i < x.n ; i ++) {
14 for (int j = 0 ; j < y.m ; j ++) {
15 for (int k = 0 ; k < x.m ; k ++) {
16 ll tmp = x[i][k] * y[k][j] ;
17 res[i][j] += tmp ;
18 }
19 }
20 }
21 return res ;
22 }
#include <bits/stdc++.h>
using namespace std;
typedef long long li;
const int N = 100 + 5;
const li INF = li(1e15);
typedef li mt[N][N];
int n, a[N];
li T;
mt d, dt;
void one(mt a) {
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
a[i][j] = 0;
}
void copy(const mt a, mt b) {
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
b[i][j] = a[i][j];
}
void mul(const mt a, const mt b, mt c) {
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j) {
c[i][j] = -INF;
for (int k = 0; k < n; ++k)
c[i][j] = max(c[i][j], a[i][k] + b[k][j]);
}
}
mt t, r;
void binpow(const mt a, li b, mt c) {
copy(a, t);
one(c);
while (b) {
if (b & 1) {
mul(c, t, r);
copy(r, c);
}
mul(t, t, r);
copy(r, t);
b >>= 1;
}
}
int main() {
cin >> n >> T;
for (int i = 0; i < n; ++i)
cin >> a[i];
for (int s = 0; s < n; ++s) {
for (int i = 0; i < n; ++i) {
if (a[i] < a[s]) {
d[s][i] = -INF;
} else {
d[s][i] = 1;
for (int j = 0; j < i; ++j)
if (a[j] <= a[i])
d[s][i] = max(d[s][i], d[s][j] + 1);
}
}
}
binpow(d, T, dt);
li res = 0;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
res = max(res, dt[i][j]);
cout << res << endl;
return 0;
}