数学知识-组合数

组合数一

题意

 算法思路

C a b 表示从a个苹果中选择b个苹果,假设有一个苹果分开,这个苹果就有选和不选两种方案,分别那么从剩下的a-1个苹果中选择b-1和b个,即 C a-1 b-1 和C a-1 b

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7,N=2010;
int c[N][N];

void init()
{
    for (int i=0;i<N;i++)
    {
        for(int j=0;j<=i;j++)
        {
            if(!j)
                c[i][j]=1;
            else
                c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
        }
    }
}

int main()
{
    int i,j,n,a,b;
    init();
    cin>>n;
    while(n--)
    {
        cin>>a>>b;
        cout<<c[a][b]<<endl;
    }
    return 0;
}

组合数二

题目

 算法思路

这里的数量级1e5次方,不可以在打表计算

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7,N=100010;
typedef long long ll;
int fat[N];
int af[N];
int qsort(int a,int n)
{
    int ans=1;
    while(n)
    {
        if(n&1)
            ans=(ll)ans*a%mod;
        a=(ll)a*a%mod;
        n>>=1;
    }
    return ans;
}

int main()
{
    int i,j,n,a,b;
    cin>>n;

    fat[0]=af[0]=1;
    for(i=1;i<N;i++)
    {
        fat[i]=(ll)fat[i-1]*i%mod;
        af[i]=(ll)af[i-1]*qsort(i,mod-2)%mod;
    }

    while(n--)
    {
        cin>>a>>b;
        cout<<(ll)fat[a]*af[a-b]%mod*af[b]%mod<<endl;
    }

    return 0;
}

求组合数三

题目

 算法思路

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
int p;

int qmi(int a,int n)
{
    int res=1;
    while(n)
    {
        if(n&1)
            res=(ll)res*a%p;
        a=(ll)a*a%p;
        n>>=1;
    }
    return res;
}

int C(int a,int b)
{
    if(b>a)
        return 0;
    int res=1;
    for(int i=1,j=a;i<=b;i++,j--)
    {
        res=(ll)res*j%p;
        res=(ll)res*qmi(i,p-2)%p;
    }
    return res;
}

int lucas(ll a,ll b)
{
    if(a<p&&b<p)
        return C(a,b);
    return (ll)C(a%p,b%p)*lucas(a/p,b/p)%p;
}

int main()
{
    int i,j,n;
    cin>>n;
    while(n--)
    {
        ll a,b;
        cin>>a>>b>>p;
        cout<<lucas(a,b)<<endl;;
    }

    return 0;
}

满足条件的01序列

题目

 算法思路

卡特兰数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;

int qsort(int a,int n)
{
    int res=1;
    while(n)
    {
        if(n&1)
            res=(ll)res*a%mod;
        a=(ll)a*a%mod;
        n>>=1;
    }
    return res;
}

int main()
{
    int i,j;
    int n,a,b;
    cin>>n;
    a=2*n;
    b=n;
    int res=1;
    for(i=a;i>a-b;i--)
        res=(ll)res*i%mod;
    for(i=1;i<=b;i++)
        res=(ll)res*qsort(i,mod-2)%mod;
    res=(ll)res*qsort(n+1,mod-2)%mod;
    cout<<res<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/xiaofengzai/p/14413791.html