组合数
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
以下是签名
${\scr {jade }}$ ${\scr {seek }}$
本文来自博客园,作者:BIxuan—玉寻,转载请注明原文链接:https://www.cnblogs.com/zhangyuxun100219/p/18882198

浙公网安备 33010602011771号