- 费马小定理求逆元
int quick_pow(int a,int b)
{
int ans=1%mod;
int tmp=a%mod;
while(b)
{
if(b&1) ans=(ll)(ans*tmp)%mod;
tmp=(ll)(tmp*tmp)%mod;
b>>=1;
}
return ans%mod;
}
int Inv(int x)
{
return quick_pow(x,mod-2);
}
- o(n+log(n))预处理逆元
void init(int n)
{
fac[0]=1;
for(int i=1;i<=n;i++) fac[i]=(ll)(fac[i-1]*i)%mod;
inv[n]=Inv(fac[n]);//通过费马小定理或扩欧计算第n项
for(int i=n-1;i>=0;i--) inv[i]=(ll)(inv[i+1]*(i+1))%mod;
return ;
}
int c(int n,int k)
{
return (fac[k]*(ll)(inv[n]*inv[k-n])%mod)%mod;
}//求k个里取n个组合数
-
扩展欧几里得求逆元
, 解一个同余方程即可
void exgcd(int a,int b,int &x,int &y)
{
if(!b) {x=1; y=0; return ;}
exgcd(b,a%b,y,x); y-=a/b*x;
return ;
}