[COCI2006-2007#4] ZBRKA 的题解
题目大意
在一个长度为 的排列中找出逆序对数量恰好为 的排列总数,其中 。
思路
考虑将 到 这些数从小到大一次填进去,因为每一次填入的数多是最大的,所以逆序对增加的数量只与其所在的位置相关,所以设计 表示前 个数逆序对为 的方案数。
在填入第 个数时因为前面的 到 都小于 ,所以 每向前移动一个位置,逆序对的数量就会增加 。
因为 的位置并没有限制,所以 。
这个方法的时间复杂度与空间复杂度都是 的,无法通过此题,所以可以使用前缀和与滚动数组优化。
AC Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+5,mod=1e9+7;
int n,c,f[N],ans;
signed main(){
cin>>n>>c;
f[0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=c;j++) f[j]=(f[j]+f[j-1])%mod;
for(int j=c;j>=i;j--){
f[j]=(f[j]-f[j-i]+mod)%mod;
}
}cout<<f[c]<<endl;
return 0;
}