组合数

C 组合数(杨辉三角形//递推)

#include<bits/stdc++.h>
using namespace std;
int c[10010][110];
int mod=10007;
int main()
{
	int n,m;
	c[1][1]=1;
	c[2][1]=2;
	cin>>n>>m;
	for(int i=2;i<=n;i++)
	{
		c[i][1]=i; 
		for(int j=2;j<=min(i,100);j++)
		{
			c[i][j]=c[i-1][j-1]+c[i-1][j];
			c[i][j]%=mod;
		}
	}
	long long ans=1;
	for(int i=1;i<=m;i++)
	{
		int x;
		cin>>x;
		if(x==0)
		{
			continue;
		} 
		ans=(ans*c[n][x])%mod;
		n-=x;
	}
	cout<<ans;
	return 0;
 } 

组合数(快速幂+乘法逆元)

#include <bits/stdc++.h>
using namespace std;
const int mod=10007;
long long cnt=1;
long long jc[10086],v[10086]={1};
int n,m,a;
long long c(int x, int y)
{
	return jc[x]*v[y]%mod*v[x-y]%mod;
}
long long ny(long long a,long long b)
{
	long long ans=1;
	while(b)
	{
		if(b&1)
		{
			ans=(ans*a)%mod; 
		}
		a=(a*a)%mod;
		b>>=1;
	}
	return ans;
}
int main(){
	jc[0] = 1;
	cin>>n>>m;
	for(int i=1;i<=10005;i ++)
	{
		jc[i]=jc[i-1]*i%mod;
		v[i]=ny(jc[i],mod-2)%mod;
	}
	for(int i=1;i<=m;i++)
	{
		cin>>a;
		cnt=cnt*c(n,a)%mod;
		n-=a;
	}
	cout<<cnt;
	return 0;
}

组合数+lucus

#include<bits/stdc++.h> 
using namespace std;
const int mod = 10007;
int ksm(int a,int b)
{
    int s=1;
    while(b)
   {
       if(b&1)
       {
	    s=s*a%mod;
       }
        b>>=1;
        a=a*a%mod;
    }
    return s;
}
int fac[10008],inv[10008];
inline int C(int n,int m)
{
    if(n<m)
	{
	    return 0;	
	}
    return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int Lucas(int n,int m)
{
    if(m==0)
	{
		return 1;
	}
    return C(n%mod,m%mod)*Lucas(n/mod,m/mod)%mod;
}
int main()
{
    fac[0] = 1;
    for(int i=1;i<mod;i++)
	{
	    fac[i]=fac[i-1]*i%mod;	
	}
    inv[mod-1]=ksm(fac[mod-1],mod-2);
    for(int i=mod-2;i!=0;i--)
	{
		inv[i]=inv[i+1]*(i+1)%mod;
	}
    int t,n,m;
    scanf("%d",&t);
    while(t--)
	{
        scanf("%d %d",&n,&m);
        printf("%d\n",Lucas(n, m));
    }
    return 0;
}

ORZ 10086

posted @ 2025-05-18 14:12  BIxuan—玉寻  阅读(16)  评论(1)    收藏  举报