ACM模版
归并排序求逆序数
/*
* 也可以用树状数组做
* a[0...n-1] cnt=0; call: MergeSort(0, n)
*/
const int N = 1010;
int a[N];
int c[N];
int cnt = 0;
void MergeSort(int l, int r)
{
int mid, i, j, tmp;
if (r > l + 1)
{
mid = (l + r) / 2;
MergeSort(l, mid);
MergeSort(mid, r);
tmp = l;
for (i = l, j = mid; i < mid && j < r;)
{
if (a[i] > a[j])
{
c[tmp++] = a[j++];
cnt += mid - i;
}
else
{
c[tmp++] = a[i++];
}
}
if (j < r)
{
for (; j < r; ++j)
{
c[tmp++] = a[j];
}
}
else
{
for (; i < mid; ++i)
{
c[tmp++]=a[i];
}
}
for (i = l; i < r; ++i)
{
a[i] = c[i];
}
}
return ;
}
逆序数推排列数
const int N = 1001;
const int C = 10001;
const long MOD = 1000000007;
long arr[N][C];
long long temp;
int main()
{
int i, j;
arr[1][0] = arr[2][0] = arr[2][1] = 1;
for (i = 3; i < N; ++i)
{
arr[i][0] = 1;
long h = i * (i + 1) / 2 + 1;
if (h > C)
{
h = C;
}
for (j = 1; j < h; ++j)
{
temp = arr[i - 1][j] + arr[i][j - 1];
arr[i][j] = temp % MOD;
if (j - i >= 0)
{
arr[i][j] -= arr[i - 1][j - i];
if (arr[i][j] < 0)
{
arr[i][j] += MOD;
}
}
}
}
while (scanf("%d %d", &i, &j) != EOF)
{
printf("%ld\n", arr[i][j]);
}
return 0;
}