1401 逆序统计(递推)

来源:互联网 发布:android源码在线 编辑:程序博客网 时间:2024/06/15 16:59

1401 逆序统计
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 钻石 Diamond
题解
查看运行结果
题目描述 Description
我们说(i,j)是a1,a2,…,an的一个逆序对当且仅当j>i且ai>aj。例如2,4,1,3,5的逆序对有3个,分别为(1,3),(2,3),(2,4)。现在已知N和K,求1..N的所有特定排列,这些排列的逆序对的数量恰好为K。输出这些特定排列的数量。

   例如N=5,K=3的时候,满足条件的排列有15个,它们是:

1,2,5,4,3 1,3,4,5,2 1,3,5,2,4 1,4,2,5,3 1,4,3,2,5

1,5,2,3,4 2,1,4,5,3 2,1,5,3,4 2,3,1,5,4 2,3,4,1,5

2,4,1,3,5 3,1,2,5,4 3,1,4,2,5 3,2,1,4,5 4,1,2,3,5

输入描述 Input Description
输入第一行有两个整数N和K。其中(N<=100,K<=N*(N-1)/2)

输出描述 Output Description
将1..N的逆序对数量为K的特定排列的数量输出,为了避免高精度计算,请将结果mod10000后再输出

样例输入 Sample Input
【样例输入1】

5 3

【样例输入2】

10 7

【样例输入3】

10 10

样例输出 Sample Output
【样例输出1】

15

【样例输出2】

4489

【样例输出3】

1670

program df;
var i,j,n,m,x,y,z,k,t:longint;
f:array[0..100,0..10000] of longint;
begin
readln(n,k);
for i:=1 to n do
f[i,0]:=1;
f[2,1]:=1;
for i:=3 to n do
for j:=0 to (i*(i-1)) div 2 do
f[i,j]:=(f[i,j-1]+f[i-1,j]-f[i-1,j-i]+10000) mod 10000;
writeln(f[n,k]);
end.

0 0