#include #define VARNAME(x) #x #define show(x) cerr << #x << " = " << x << endl using namespace std; using ll = long long; using ld = long double; template ostream& operator<<(ostream& os, const vector& v) { os << "sz:" << v.size() << "\n["; for (const auto& p : v) { os << p << ","; } os << "]\n"; return os; } template ostream& operator<<(ostream& os, const pair& p) { os << "(" << p.first << "," << p.second << ")"; return os; } constexpr ll MOD = (ll)1e9 + 7LL; constexpr ld PI = static_cast(3.1415926535898); template constexpr T INF = numeric_limits::max() / 10; int main() { cin.tie(0); ios::sync_with_stdio(false); int N, K; cin >> N >> K; vector a(N); for (int i = 0; i < N; i++) { cin >> a[i]; } const int SIZE = N * (N - 1) / 2; vector> dp(N + 1, vector(SIZE + 1, 0)); // 長さiで転倒数j vector> sum(N + 1, vector(SIZE + 1, 0)); // dp[i][0]+dp[i][1]+...+dp[i][j]; dp[1][0] = 1; sum[1][0] = 1; for (int j = 1; j <= SIZE; j++) { sum[1][j] += sum[1][j - 1]; } for (int i = 2; i <= N; i++) { const int size = i * (i - 1) / 2; for (int j = 0; j <= size; j++) { const int lower = max(0, j - i + 1); const int upper = j; const int sumation = (sum[i - 1][upper] - (lower == 0 ? 0LL : sum[i - 1][lower - 1]) + MOD) % MOD; dp[i][j] = sumation; } for (int j = 0; j <= SIZE; j++) { sum[i][j] += ((j == 0 ? 0 : sum[i][j - 1]) + dp[i][j]) % MOD; } } cout << sum[N][K] << endl; return 0; }