一眼题...f[i][j]前i个数有j个逆序对的数量
f[i][j]=sigma(f[i-1][j-k]){1<=k<=i}
维护一个前缀和即可
#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> #define ll long long using namespace std; const int maxn=1010,mod=1e4; int n,k; int f[maxn][maxn],sum[maxn]; void read(int &k) { int f=1;k=0;char c=getchar(); while(c<‘0‘||c>‘9‘)c==‘-‘&&(f=-1),c=getchar(); while(c<=‘9‘&&c>=‘0‘)k=k*10+c-‘0‘,c=getchar(); k*=f; } inline int MOD(int x){return x>=mod?x-mod:x;} int main() { read(n);read(k); f[0][0]=1; for(int i=1;i<=n;i++) for(int j=0;j<=min(i*(i-1)>>1,k);j++) { sum[j]=MOD((j?sum[j-1]:0)+f[i-1][j]); f[i][j]=MOD(sum[j]-sum[j-i]+mod); } printf("%d\n",f[n][k]); return 0; }
时间: 2024-10-06 09:35:30