限制
时间限制: 1 Sec 内存限制: 128 MB
问题描述
对于排列(P1,P2,...,PN),定义(i,j)为逆序对当且仅当i<j且Pi>Pj。统计{1,2,...,N}的所有排列中,逆序对数量为M的排列数量。
输入格式
第一行包含两个正整数N,M。
输出格式
应包含一个整数,表示满足条件的排列数除以124567的余数。
输入样例
3 1
输出样例
2
数据规模
30%的数据, N≤ 10。
100%的数据,0 <N,M≤ 1000。
分析
我发现了这道题的一些规律:
f[i][j]=f[i-1][j]+f[i][j-1] (i>j)
f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-i] (i<=j)
因为最终的答案要除以124567的余数,所以在 (i<=j) 的情况中,
f[i-1][j-i] 可能会大于 f[i-1][j]+f[i][j-1] 所以在减的过程中要加上124567。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,i,j,a[1005],f[1005][1005];
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i) f[i][0]=1;
for(i=2;i<=n;++i) for(j=1;j<=m;++j) if(i>j) f[i][j]=(f[i-1][j]+f[i][j-1])%124567;
else f[i][j]=(f[i-1][j]+f[i][j-1]-f[i-1][j-i]+124567)%124567;
printf("%d",f[n][m]);
return 0;
}