排列组合问题

来源:互联网 发布:陆基巡航导弹参考数据 编辑:程序博客网 时间:2024/05/29 01:53

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

这数据写个暴力都拿不了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 1000000using 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\n",ans);    }       return 0;}