由对称性得知,如果一个数字成立(如1234),那么这个数字置反一定不成立(如4321),那么我们可以大胆猜想一个定理:对于长为2*n的序列,这个序列的合法排列数为((2*n)!/2)。
注意,此处有着大量模运算,除法需要使用逆元。
#include<cstdio> #include<iostream> #define ll long long using namespace std; const ll MOD=1e9+7; ll poww(ll a,ll b){ ll ans=1; while(b){ if(b&1)ans=(ans*a)%MOD; a=(a*a)%MOD; b>>=1; } return ans; } ll inverse;//逆元 ll f[300000];//阶乘 void init(){ inverse=poww(2,MOD-2); f[0]=1; for(int i=1;i<=200000;i++){ f[i]=(f[i-1]*i)%MOD; } } int main(){ init(); int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); n=n*2; cout<<(inverse*f[n])%MOD<<endl; } return 0; }