题目大意:
让你求n序列中,有多少对逆序对
思路:
可以用递推,设f[i][j]为前i个有k对逆序对,则递推公式为:
然后看样例,发现数很大,所以…高精加压位走起
#include<cstdio>
#include<iostream>
#define MOD 1000000000
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
using namespace std;
int f[51][1501][11],n,k;
int main()
{
fre(inversion);
f[1][0][1]=1;//初始化
for(int i=2;i<=50;i++)//枚举当前枚举到底几个数
for(int j=0;j<=1500;j++)//枚举序列对
for(int k=0;k<=(min(i-1,j));k++)//枚举在哪里插入
for(int l=1;l<=10;l++)//高精
{
f[i][j][l]+=f[i-1][j-k][l];
f[i][j][l+1]+=f[i][j][l]/MOD;
f[i][j][l]%=MOD;
}
while(cin>>n>>k)//多组
{
int ws=10;
if(n==0&&k==0)break;//跳出
while (!f[n][k][ws]&&ws>1) ws--;//减0
printf("%d",f[n][k][ws]);//输出
for(int i=ws-1;i>0;i--)
printf("%0*d",9,f[n][k][i]);//压位
printf("\n");
}
return 0;
}