给我们一个n,让我们找满足题意的1~2*n的排列的个数,满足题意当且仅当对于一个任意的排列
a1,a2,……,an,有大于等于n个ai满足ai<ai+1。
分析:一个长度为2*n的排列,满足ai<ai+1的i最多有2*n-1个,最少有0个,区间 [0,n)和区间 [n,2*n-1]都具有n个元素,如果我们能证明满足ai<ai+1的i的个数出现在两个区间的排列数是一样的,那么我们就能够建立起1~2*n的全排列的个数与满足题意的排列个数之间的关系了。
下面来证明一下满足ai<ai+1的i的个数出现在两个区间的排列数是一样的。
对于排列a1,a2,……a2*n,不妨假设满足ai<ai+1的个数有k个,则容易知道对于排列
a2*n,……,a2,a1,满足ai<ai+1的个数有2*n-1-k个
若k属于区间 [0,n),则 2*n-1-k属于区间[n,2*n-1],反之
若k属于区间 [n,2*n-1],则 2*n-1-k属于区间 [0,n);
这样我们就可以证明满足ai<ai+1的i的个数出现在两个区间的排列数是一样的,也就是说我们直接求出1~2*n的全排列的个数再除以2即可得到答案。
下面是代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int mod=1e9+7;
int main()
{
int T;
cin>>T;
while(T--)
{
long long ans=1;
int n;
scanf("%d",&n);
for(int i=3;i<=2*n;i++)//从3开始就避免了除2
ans=ans*i%mod;
printf("%lld\n",ans);
}
return 0;
}
418

被折叠的 条评论
为什么被折叠?



