肉眼挑不出跟题解的区别了QAQ
#include <bits/stdc++.h>
namespace blcqj {
using namespace std;
typedef long long ll;
#define lb(x) (x & -x)
int n, m, T;
const ll mod = 1e9 + 7;
int a[1003], b[1003];
ll tr[1003][1003];
void upd(int x, ll v, int k) {
for (int i = x; i <= n; i += lb(i))
(tr[k][i] += v) %= mod;
}
int qry(int x, int k) {
ll an = 0;
for (int i = x; i; i -= lb(i))
(an += tr[k][i]) %= mod;
return an;
}
void main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
cin >> T;
for (int _ = 1; _ <= T; ++_) {
cin >> n >> m;
for (int i = 1; i <= n; ++i)
cin >> a[i], b[i] = a[i];
sort(b + 1, b + 1 + n);
int l = unique(b + 1, b + 1 + n) - b - 1;
for (int i = 1; i <= n; ++i)
a[i] = lower_bound(b + 1, b + 1 + l, a[i]) - b;
ll v1, ans = 0;
for (int i = 1; i <= n; ++i) {
upd(a[i], 1, 1);
for (int j = 2; j <= m; ++j) {
v1 = qry(a[i] - 1, j - 1);
upd(a[i], v1, j);
if (j == m) (ans += v1) %= mod;
}
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
tr[j][i] = 0;
if (m == 1) (ans += n) %= mod;
cout << "Case #" << _ << ": " << ans << '\n';
}
}
} using namespace blcqj;
int main() {
blcqj::main();
return 0;
}