题目概述
求
n
的排列中逆序对数为
解题报告
好像在水博客?如果知道反序表这种东西这就是道很简单的DP了。
定义
f[i][j]
表示反序表前
i
个和为
示例程序
#include<cstdio>
using namespace std;
const int maxn=1000,maxk=20000,MOD=1000000007;
int te,n,K,f[maxn+5][maxk+5],sum[maxk+5];
inline void AMOD(int &x,int tem) {x+=tem;if (x>=MOD) x-=MOD;}
void Make()
{
f[0][0]=1;
for (int i=1;i<=maxn;i++)
{
sum[0]=f[i-1][0];for (int j=1;j<=maxk;j++) AMOD(sum[j]=sum[j-1],f[i-1][j]);
for (int j=0;j<=maxk;j++) {f[i][j]=sum[j];if (j>=i) AMOD(f[i][j],MOD-sum[j-i]);}
}
}
int main()
{
freopen("program.in","r",stdin);
freopen("program.out","w",stdout);
for (Make(),scanf("%d",&te);te;te--) scanf("%d%d",&n,&K),printf("%d\n",f[n][K]);
return 0;
}