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;
    }
  • 相关阅读:
    正则表达式点滴
    异步处理与界面交互
    关于利用VS2008创建项目遇到的小困惑备忘
    using App.cofig to Store value
    Castle ActiveRecord学习笔记三:初始化配置
    无服务器端的UDP群聊功能剖析
    为VS2010默认模板添加版权信息
    理论有何用?不问“何用”,先问“用否”!
    微软没有公开的游标分页
    那些满脑子只考虑后台数据库的人他整天研究的就是针对自己查询一些数据的sql语句
  • 原文地址:https://www.cnblogs.com/xiaofengzai/p/14413791.html
Copyright © 2011-2022 走看看