1.费马小定理
求a/b=x(mod M)
只要M是一个素数,而且b不是M的倍数,就可以用一个逆元整数b1,通过 a/b=a*b1 (mod M),只能来以乘换除
ll niyuan(ll a,ll n)
{
ll ret=1;
while(n)
{
if(n&1)
ret=(ret*a)%mod;
a=(a*a)%mod;
n>>=1;
}
return ret;
}
ll k=niyuan(k,mod-2);//求k的逆元
2.扩展欧几里得求逆元(不理解)
int ex_gcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int r=ex_gcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return r;
}
int mod_reverse(int a,int n)//ax=1(mod n) 求a的逆元x
{
int d,x,y;
d=ex_gcd(a,n,x,y);
if(d==1)
return (x%n+n)%n;
else
return -1;
}
ll C(ll m,ll n)//求组合数
{
ll z=1,k=1,i;
for(i=n;i>=n-m+1;i--)//分子
z=z*i%MOD;
for(i=1;i<=m;i++)//分母
k=k*i%MOD;
return z*mod_reverse(k,MOD)%MOD;//除法取模变乘法取模
}