数论之组合数取模

来源:互联网 发布:如何禁止用户安装软件 编辑:程序博客网 时间:2024/05/16 10:21

组合数取模:Cmn% p

三个链接表示的是该种方法的定理定义之类的~怕三种方法合在一起太长(ノ`Д)ノ

一、杨辉三角打表求组合数——1≤m≤n≤1000,1≤p≤109

int Combination(int n)  {       int i,j;       a[0][0]=1;       for(i=0;i<=n;i++)       {            a[i][0]=a[i][i]=1;            for(j=1;j<i;j++)            {                 a[i][j]=(a[i-1][j-1]+a[i-1][j])%mod;            }       }       return 0;  }  

二、乘法逆元来直接求组合数——n,m不大于10^5
其中三种求逆元方法及模板请戳蓝↑~

三、Lucas定理求组合数——n,m大于10^5并且p是素数
Lucas定理处理比较大的数。

long long Pow(long long a,long long b)    {        long long ans=1;        while(b)        {            if(b&1)            {                b--;                ans=(ans*a)%p;            }            b>>=1;            a=(a*a)%p;        }        return ans;    }    long long C(long long n,long long m)    {        if(n<m)            return 0;        long long a=1,b=1;        while(m)        {            a=(a*n)%p;            b=(b*m)%p;            m--;            n--;        }        return (a*Pow(b,p-2))%p;    }    long long Lucas(long long n,long long m)    {        if(m==0)            return 1;        return Lucas(n/p,m/p)*C(n%p,m%p)%p;    }    

ps:
组合数好像大部分都是高中的知识○| ̄|_

啊啊啊就不该让强迫症来写博客啊摔!

原创粉丝点击