题意:对于一个1~n的全排列,逆序对数为k的排列有几个
对于一个已经排好的1~i-1的排列,我们插入数i,可以贡献[0,i-1]个逆序对
所以第1~i的逆序对为m的排列可以由1~i-1的逆序对为[m-i+1,m]的排列插入数i形成
令f[i,j]表示1~i的全排列中逆序对数为j的排列总数
得出关系(方程):f[i,j]=sigma(f[i-1,j-k]) (0<=k<=i-1)
时间复杂度为O(n^3)
然后很显然f[i,j]是由f[i-1]的一段连续的区间和得来,那么我们对f[i-1,j]维护一个前缀和sum[j]即可优化为O(n^2)
const
mo=10000;
var
f :array[0..1010,0..1010] of longint;
n,m :longint;
i,j :longint;
sum :array[-1..1010] of longint;
function max(a,b:longint):longint;
begin
if a<b then exit(b) else exit(a);
end;
begin
read(n,m);
for i:=1 to n do f[i,0]:=1;
for i:=2 to n do
begin
for j:=0 to m do sum[j]:=sum[j-1]+f[i-1,j];
for j:=1 to m do f[i,j]:=(sum[j]-sum[max(-1,j-i)]+mo) mod mo;
end;
writeln(f[n,m]);
end.
——by Eirlys