Codeforces Round #745 (Div. 2) A. CQXYM Count Permutations


由对称性得知,如果一个数字成立(如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;
}
原文地址:https://www.cnblogs.com/zbsy-wwx/p/15439022.html