zoukankan      html  css  js  c++  java
  • 数学知识-组合数

    组合数一

    题意

     算法思路

    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;
    }
  • 相关阅读:
    pytroch tensor初始化权重、改变tensor某行列为指定值
    蜜蜂寻路
    童年生活二三事
    母牛的故事
    星际密码
    斐波那契凤尾
    客似云来
    养兔子
    NowCoder数列
    采花生
  • 原文地址:https://www.cnblogs.com/xiaofengzai/p/14413791.html
Copyright © 2011-2022 走看看