C++版本
使用方法:卢卡斯定理
求逆元的方式:扩展欧几里得算法
其中mod是要取余的数
long long Extended_Euclid(long long a,long long b,long long &x,long long &y)
{
if(a==0&&b==0)
return -1;
if(b==0)
{
x=1;
y=0;
return a;
}
long long temp=Extended_Euclid(b,a%b,y,x);
y-=a/b*x;
return temp;
}
long long Inverse_Element(long long a,long long p)
{
long long x,y;
long long d=Extended_Euclid(a,p,x,y);
if(d==1)
return(x%p+p)%p;
else
return -1;
}
long long factorialMod(long long n)
{
long long ans=1;
for(int i=2;i<=n;i++)
ans=ans*i%mod;
return ans;
}
long long combinationMod(long long n,long long m)
{
return n<m?0:factorialMod(n)%mod*Inverse_Element(factorialMod(m),mod)%mod*Inverse_Element(factorialMod(n-m),mod)%mod;
}
long long lucas(long long n,long long m)
{
return m==0?1:lucas(n/mod,m/mod)*combinationMod(n%mod,m%mod)%mod;
}
这篇博客介绍了如何使用C++编程实现组合数取模的操作,主要依赖于卢卡斯定理,并且讲解了扩展欧几里得算法在求逆元过程中的应用,整个计算过程针对指定的模数进行。
577

被折叠的 条评论
为什么被折叠?



