题面
解法
设\(f_{i,j}\)表示序列中已经有\(1-i\),逆序对总数为\(j\)的方案数
考虑如何转移到\(f_{i,j}\)
即将\(i\)插入到\(1\)至\(i-1\)的序列中,产生的影响范围为\(0\)到\(i-1\)
从而可以得到转移方程:\(f_{i,j}=\sum_{k=j-i+1}^if_{i-1,k}\)
前缀和优化一下即可
时间复杂度:\(O(nk)\)
代码
#include <bits/stdc++.h>
#define Mod 10000
#define N 1010
using namespace std;
int f[N][N], s[N][N];
int main() {
int n, K; cin >> n >> K;
f[1][0] = s[1][0] = 1;
for (int i = 1; i <= K; i++) s[1][i] = (s[1][i - 1] + f[1][i]) % Mod;
for (int i = 2; i <= n; i++)
for (int j = 0; j <= K; j++) {
if (j < i) f[i][j] = s[i - 1][j];
else f[i][j] = (s[i - 1][j] - s[i - 1][max(0, j - i)] + Mod) % Mod;
s[i][j] = f[i][j];
if (j) s[i][j] = (s[i][j] + s[i][j - 1]) % Mod;
}
cout << f[n][K] << "\n";
return 0;
}