排列组合问题

这里写图片描述
这里写图片描述

这数据写个暴力都拿不了30分 T_T。
C(n,i)*C(n,i)=C(n,i)*C(n,n-i) => 结合现实意义,在n个里面选 i 个,再在n个里面选n-i个的方案数。
就等价于在前n个中选 i 个,在后n各种选n-i个。而且i = 0~n => 在2*n各种选n个。
那么这里写图片描述=C(2*n,n);

答案要对1000000007取模,需要逆元(可用费马小定理,下面是式子)

C(2n,n)modp=(2n)!(n!n!)xmodp(x=p2)

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#define LL long long
#define MOD 1000000007
#define N 1000000
using namespace std;
int T;
LL ans,P[2000009],n;
void init()
{
    LL p=1;
    for(LL i=1;i<=2*N;i++) p=(p*i)%MOD,P[i]=p;
}
LL Fast_Pow(LL x,LL p)//x^p 
{
    LL t1=1,t2=x;
    while(p)
    {
        if(p%2==1) t1=(t1*t2)%MOD;
        t2=(t2*t2)%MOD;
        p/=2;
    }
    return t1%MOD;
}
LL get_ans(int x)
{
    return (P[2*x]*Fast_Pow(P[x]*P[x]%MOD,MOD-2))%MOD;
}
int main()
{
    init();
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        ans=get_ans(n);
        printf("%lld
",ans);
    }   
    return 0;
}
原文地址:https://www.cnblogs.com/dfsac/p/7587796.html