这里写代码片
///LUCAS计算组合数模板
///计算C(n,m)对p取余 最后结果返回C(n,m,p);
typedef long long LL;
LL quick_pow(LL a,LL b,LL p)
{
LL ans=1,temp=a;
while(b)
{
if(b&1) ans=ans*temp%p;
temp=temp*temp%p;
b>>=1;
}
return ans;
}
LL C(int n,int m,int p)
{
if(n<m) return 0;
if(n==m) return 1;
if(m>n-m) m=n-m;
LL ans=1,cn=1,cm=1;
for(LL i=0;i<m;++i)
{
cn=(cn*(n-i))%p;
cm=(cm*(m-i))%p;
}
ans=(cn*quick_pow(cm,p-2,p))%p;
return ans;
}
LL lucas(int n,int m,int p)
{
LL ans=1;
while(n&&m&&ans){ans=(ans*C(n%p,m%p,p))%p;n/=p;m/=p;}
return ans;
}
组合数模板
最新推荐文章于 2025-07-11 10:14:08 发布