首页 > 代码库 > 组合计数

组合计数

技术分享

技术分享

技术分享

技术分享

技术分享

 

技术分享

技术分享

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<memory.h>
#include<cmath>
#include<map>
#include<set>
#define INF 0x3f3f3f3f
#define PII pair<int,int>
#define MAX_NODE 1000005;
using namespace std;
int p,q,k,a,b;
long long c[1005][1005];
long long pow_mod(long long a,long long b,long long mod)
{
    int res=1;
    while(b)
    {
        if(b&1)
        {
            res=res*a%mod;
        }
        a=a*a%mod;
        b>>=1;
    }
    return res;
}

int main()
{
    cin>>p>>q>>k>>a>>b;
    for(int i=1;i<=k;i++)
        c[i][0]=c[i][i]=1;
    for(int i=2;i<=k;i++)
    {
        for(int j=1;j<i;j++)
        {
            c[i][j]=(c[i-1][j]+c[i-1][j-1])%10007;
        }
    }
    long long part_A=pow_mod(p,a,10007);
    long long part_B=pow_mod(q,b,10007);
    long long before=part_A*part_B*c[k][a]%10007;
    cout<<before<<endl;
    return 0;
}

 

技术分享

技术分享

#include<iostream>
#include<stdio.h>
#include<vector>
#include<queue>
#include<algorithm>
#include<memory.h>
#include<cmath>
#include<map>
#include<set>
#define INF 0x3f3f3f3f
#define PII pair<int,int>
#define MOD 1000000007
using namespace std;
int n,p,q,k,a,b;

//这里只需要两维 否则空间超
//long long c[100005][55];
long long dp[2][100005];
long long ladu[100005];
long long pow_mod(long long a,long long b,long long mod)
{
    int res=1;
    while(b)
    {
        if(b&1)
        {
            res=res*a%mod;
        }
        a=a*a%mod;
        b>>=1;
    }
    return res;
}

int main()
{
    cin>>n>>k;
    for(int i=1; i<=n; i++)
        cin>>ladu[i];
    sort(ladu+1,ladu+n+1);
    long long ans=0;

    if(k==1)
    {
        for(int i=1;i<=n;i++)
        {
            ans=(ans+ladu[i])%MOD;
        }
        cout<<ans<<endl;
        return 0;
    }

    memset(dp,0,sizeof(dp));
    dp[1][0]=dp[1][1]=dp[0][0]=dp[0][1]=1;
    bool flag=0;
    for(int i=2; i<=n; i++)
    {
        for(int j=1; j<=k-1; j++)
        {
            dp[flag][j]=(dp[!flag][j]+dp[!flag][j-1])%MOD;
        }
        if(i>=k)
            ans=(ans+ladu[i]*dp[!flag][k-1]%MOD)%MOD;
        flag=!flag;
    }
    cout<<ans<<endl;
    return 0;
}

 

组合计数